编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有 6262 个不同数位 {0−9,A−Z,a−z}{0−9,A−Z,a−z}。
输入格式
第一行输入一个整数,代表接下来的行数。
接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。
输入进制和输出进制都在 22 到 6262 的范围之内。
(在十进制下)A=10,B=11,…,Z=35,a=36,b=37,…,z=61A=10,B=11,…,Z=35,a=36,b=37,…,z=61 (0−90−9 仍然表示 0−90−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
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int a, b;//a进制转化成b进制
string a_line, b_line;
cin >> a >> b >> a_line;
vector<int>number;
for (auto c : a_line)
{
if (c >= '0' && c <= '9')number.push_back(c - '0');
if (c >= 'A' && c <= 'Z')number.push_back(c - 'A' + 10);
if (c >= 'a' && c <= 'z')number.push_back(c - 'a' + 36);
}
//将数字反转成由低位到高位
reverse(number.begin(), number.end());
vector<int>res;
while (number.size())
{
int r = 0;//余数
//整个for循环的过程只是计算这个数进行一次短除法得到的结果
//整个while()循环得到得res就是这个数进行短除法最终得到的结果
for (int i = number.size() - 1; i >= 0; i--)
{
number[i] += r * a;
r = number[i] % b;
number[i] /= b;
}
res.push_back(r);
while (number.size() && number.back() == 0)number.pop_back();
}
reverse(res.begin(), res.end());//短除法逆序才是答案
for (auto x : res)
{
if (x <= 9)b_line += char(x + '0');
if (x >= 10 && x <= 35)b_line += char(x - 10 + 'A');
if (x >= 36) b_line += char(x - 36 + 'a');
}
cout << a << ' ' << a_line << endl;
cout << b << ' ' << b_line << endl;
cout << endl;
}
return 0;
}