解题思路
进制转换的题很简单,这里主要是取余的操作值得一提。原来的数字表示的是(a_0 imes k^{n-1} + a_1 imes k^{n-1} + ... + a_n imes k^0),这里在除x取余转成x进制的时候没必要先转成十进制,直接通过处理每一位表示的数来求余数即可。
代码
int a,b;
string s,ans;
vector<int> tmp;
inline int f(char ch) {
if (ch<='9') return ch-'0';
if (ch<='Z') return ch-'A'+10;
return ch-'a'+36;
}
inline char ff(int num) {
if (num<=9) return num+'0';
if (num<=35) return num-10+'A';
return num-36+'a';
}
void solve() {
reverse(s.begin(),s.end());
for (auto c : s) tmp.push_back(f(c));
while(!tmp.empty()) {
int r = 0, sz = tmp.size();
for (int i = sz-1; i>=0; --i) {
//从高位开始模拟除法和取余操作,r即余数
tmp[i] += r*a;
r = tmp[i]%b;
tmp[i] /= b;
}
ans.push_back(ff(r));
//排除先导0
while(!tmp.empty() && !tmp.back()) tmp.pop_back();
}
reverse(ans.begin(),ans.end());
}
int main() {
int t; cin >> t;
while(t--) {
cin >> a >> b >> s;
cout << a << ' ' << s << endl;
solve();
cout << b << ' ' << ans << endl << endl;
tmp.clear(); ans.clear();
}
return 0;
}