编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有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
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
//位数太高直接用字符串输出
int main ()
{
int cnt;
cin >> cnt;
while (cnt --)
{
int a, b;//将a进制转换成b进制
string num1_line, num2_line;//a进制的字符串和b进制的字符串
vector<int> num1, num2;
cin >> a >> b >> num1_line;
//将num1变成数组的形式
for (int i = 0; i < num1_line.size(); i ++)
{
if(num1_line[i]<= '9' && num1_line[i] >= '0') num1.push_back(num1_line[i] - '0');
if(num1_line[i]<= 'Z' && num1_line[i] >= 'A') num1.push_back(num1_line[i] - 'A' + 10);
if(num1_line[i]<= 'z' && num1_line[i] >= 'a') num1.push_back(num1_line[i] - 'a' + 36);
}
reverse(num1.begin(), num1.end());
//短除num1
while (num1.size())
{
int t = 0;//剩余的余数
for (int i = num1.size() - 1; i >= 0; i --)
{
num1[i] += t * a;
t = num1[i] % b;
num1[i] /= b;
}
num2.push_back(t);
while (num1.size() && num1.back() == 0)
num1.pop_back();
}
reverse(num2.begin(), num2.end());
//将数组转换为字符串
for (int i = 0; i < num2.size(); i ++)
{
if(num2[i] <= 9) num2_line += char(num2[i] + '0');
if(num2[i] <= 35 && num2[i] >= 10) num2_line += char(num2[i] - 10 + 'A');
if(num2[i] <= 61 && num2[i] >= 36) num2_line += char(num2[i] - 36 + 'a');
}
cout << a << ' ' << num1_line << endl;
cout << b << ' ' << num2_line << endl;
cout << endl;
}
}