思路两种
第一种:
a进值转化为10 进制,然后10进制转化为b进制。
第二种:
由第一种推倒得出,由a进制直接转化为b进制。
注意: 高精度除法
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
int n,t;
int x[maxn], y[maxn];
int main()
{
cin >> t;
while(t --)
{
int a, b;
string a_line, b_line;
cin >> a >> b;
cin >> a_line;
vector<int> num;
for(int i = 0; i < a_line.size(); i ++) //将输入进来的字母转化为数字,存储到num里面方便计算
{
if(a_line[i] >= '0' && a_line[i] <= '9') num.push_back(a_line[i]-'0');
if(a_line[i] >='A' && a_line[i] <='Z') num.push_back(a_line[i]-'A'+10);
if(a_line[i]>='a' && a_line[i]<='z') num.push_back(a_line[i]-'a'+36);
}
reverse(num.begin(),num.end()); //存储的数字由大到小,转化一下
vector<int> res; //用来存储转化后的数组
while(num.size()) //利用短除法加高精度除法转化进制
{
int r = 0;
for(int i = num.size()-1; i >= 0; i --)
{
num[i] += r*a;
r = num[i]%b;
num[i] /= b;
}
res.push_back(r);
while(num.size()&&num.back()==0) num.pop_back(); //去除0 减少num的数量
}
reverse(res.begin(),res.end()); // 转化为
for(auto x : res) //将res数组再变成字母表示的东西
{
if(x<=9) b_line += char(x+'0');
if(x>=10&&x <=35) b_line += char('A'+x-10);
if(x>=36) b_line += char('a'+x-36);
}
cout << a << ' ';
for(int i = 0; i < a_line.size(); i ++)
cout << a_line[i];
cout << endl;
cout << b << " ";
cout << b_line << endl;
cout << endl;
}
return 0;
}