题目描述
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
C++ 代码
# include <iostream>
# include <algorithm>
# include <vector>
using namespace std;
int n;
int main()
{
scanf("%d",&n);
while(n--)
{
int a, b ;
string ch;
vector<int> ch1;
cin >> a >> b >> ch;
for(int i = ch.size()- 1 ; i >= 0 ; i--)
{
if(ch[i] >= '0' && ch[i] <= '9')
{
ch1.push_back(ch[i] - '0');
}
else if(ch[i] >= 'A' && ch[i] <= 'Z')
{
ch1.push_back(ch[i] - 'A' + 10);
}
else if(ch[i] >= 'a' && ch[i] <= 'z')
{
ch1.push_back(ch[i] - 'a' + 36);
}
} // ch1中的数,下标0存个位
vector<char> res; //存入ch1从a进制变b进制后的值
while(ch1.size()) //如果ch1不为0的话
{
int t = 0;
for(int i = ch1.size() - 1 ; i >= 0 ; i--)
{
ch1[i] += t * a ;
t = ch1[i] % b;
ch1[i] /= b;
}
if(t >= 0 && t <= 9)
{
res.push_back(t + '0');
}
else if(t >= 10 && t <= 35)
{
res.push_back(t - 10 + 'A');
}
else
{
res.push_back(t - 36 + 'a');
}
while(ch1.size() && ch1.back() == 0)
{
ch1.pop_back();
}
}
reverse(res.begin(),res.end()); //高位在0
printf("%d ",a);
cout << ch << endl;
printf("%d ",b);
for(auto temp : res)
{
printf("%c",temp);
}
printf("\n\n");
}
return 0;
}