数的进制转换

124. 数的进制转换

编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有62个不同数位{0-9,A-Z,a-z}。
输入格式
第一行输入一个整数,代表接下来的行数。
接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。
输入进制和输出进制都在2到62的范围之内。
(在十进制下)A = 10,B = 11,…,Z = 35,a = 36,b = 37,…,z = 61 (0-9仍然表示0-9)。
输出格式
对于每一组进制转换,程序的输出都由三行构成。
第一行包含两个数字,首先是输入进制(十进制表示),然后是用输入进制表示的输入数字。
第二行包含两个数字,首先是输出进制(十进制表示),然后是用输出进制表示的输入数字。
第三行为空白行。
同一行内数字用空格隔开。
输入样例:

8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030

输出样例:

62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001

10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2

16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A

35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05

23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj

49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S

61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030

5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890

1.高精度转换

秦九韶+短除法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wWd3ZlSg-1583898444912)(p1.png)]
先利用秦九韶a进制转化为10进制,例如 ( 12345 ) 6 = ( ( ( ( ( 1 × 6 ) × 2 × 6 ) × 3 × 6 ) × 4 × 6 ) × 5 ) (12345)_6=(((((1×6)×2×6)×3×6)×4×6)×5)
再用短除法将10进制转化为b进制。
需要高精。
在这里插入图片描述

2.短除法

我们把A按照a进制数做除法运算进行短除法,每次保留余数是短除法的套路。例如 ( 413 ) 5 (413)_5 转化成3进制数为 ( 11000 ) 3 (11000)_3 在这里插入图片描述
核心代码十行不到就写完了。

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
string sa,sb;
int a,b;
int A[N],B[N];
void solve(){
    sb.clear();
    int cnt=0,k=0,j=0;
    for(auto c : sa){
        if(c<='9'&&c>='0') A[cnt++]=c-'0';
        if(c<='Z'&&c>='A') A[cnt++]=c-'A'+10;
        if(c<='z'&&c>='a') A[cnt++]=c-'a'+36;
    }
    while(j<cnt){
        for(int i=j;i<cnt-1;++i){
            A[i+1]+=A[i]%b*a;
            A[i]/=b;
        }
        B[k++]=A[cnt-1]%b;
        A[cnt-1]/=b;
        if(j<cnt&&A[j]==0) ++j;
    }
    for(int i=k-1;i>=0;--i){
        sb+=(char)(B[k-i-1]<=9?B[k-i-1]+'0':(B[k-i-1]<=35?B[k-i-1]-10+'A':B[k-i-1]-36+'a'));
    }
    reverse(sb.begin(),sb.end());
    j=0;
    while(sb[j]=='0'&&j<k-1) ++j;
    cout<<a<<" "<<sa<<'\n';
    cout<<b<<" ";
    for(j;j<k;++j)
        cout<<sb[j];
    cout<<'\n'<<'\n';
}
int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>a>>b;
        cin>>sa;
        solve();
    }
}
发布了96 篇原创文章 · 获赞 11 · 访问量 2251

猜你喜欢

转载自blog.csdn.net/weixin_43769146/article/details/104793354
今日推荐