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

题目链接

解题思路

  进制转换的题很简单,这里主要是取余的操作值得一提。原来的数字表示的是\(a_0\times k^{n-1} + a_1\times k^{n-1} + ... + a_n\times 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;
}
posted @ 2020-07-16 16:49  shuitiangong  阅读(159)  评论(0编辑  收藏  举报