AcWing 124 数的进制转换 (高精度)

题目链接

解题思路

  进制转换的题很简单,这里主要是取余的操作值得一提。原来的数字表示的是(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;
}
原文地址:https://www.cnblogs.com/shuitiangong/p/13323499.html