题目描述
编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有 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 <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;//循环T次
cin >> T;
while (T -- )
{
int 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);//偏移量是10
if (c >= 'a' && c <= 'z') number.push_back(c - 'a' + 36);//偏移量是36
}
//高精度习惯,从低位到高位存
reverse(number.begin(), number.end());
vector<int> res;//记录答案
while(number.size())
{
int r = 0;
for (int i = number.size() - 1; i >= 0; i -- )
{
//类似与10进制,上一个数没除尽,10进制是乘以10后继续除,这里乘以a
number[i] += r * a;
r = number[i] % b;
number[i] /= b;
}
//剩出来的r是求出来的b进制中的最低位
res.push_back(r);
//去除前导0
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;
}
}