进位运算的高精度写法
原理是把高精度除法的乘数从10变成a,循环直至数组A变为长度为1的0则break
这题的输出格式有点坑,不用特判 T==0 的情况输不输出换行
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int T;
vector<int> div(vector<int> &A, int a, int b, LL &r){
vector<int> C;
r = 0;
for(int i = A.size()-1; i >= 0; i--){
r = r*a+A[i];
C.push_back(r/b);
r %= b;
}
reverse(C.begin(),C.end());
while(C.size()>1 && !C.back()) C.pop_back();
return C;
}
int main(){
cin >> T;
while(T--){
string sa;
int a,b;
cin >> a >> b >> sa;
vector<int> A,B;
for(int i = sa.size()-1; i >= 0; i--){
if(sa[i] >= '0' && sa[i] <= '9')A.push_back(sa[i]-'0');
if(sa[i] >= 'a' && sa[i] <= 'z')A.push_back(sa[i]-'a'+36);
if(sa[i] >= 'A' && sa[i] <= 'Z')A.push_back(sa[i]-'A'+10);
}
while(true){
LL r;
A = div(A,a,b,r);
B.push_back(r);
if(A.size()==1 && A[0] == 0)break;
}
cout << a << " " << sa << endl;
cout << b << " ";
for(int i = B.size()-1; i >= 0; i--){
char c = B[i];
if(c >= 0 && c <= 9) c += '0';
else if(c >= 36 && c <= 61) c += 'a'-36;
else if(c >= 10 && c <= 35) c += 'A'-10;
cout << c;
}
cout << endl;
cout << endl;
}
return 0;
}