【进制转换/高精度取余】acwing124

传送门

a进制的数s,转换成b进制的数。
每次s对b取余的结果就是b进制数的低位。然后s再除以b,再重复取余,直到商0。
涉及高精度取余的操作,从高位到地位,每次s[i]%b = r,得到的余数借位到下一位的时候,由于可能不是十进制,所以下一位是r * a + s[i+1];最后所有位除法操作结束剩下的r就是一位结果

#include<bits/stdc++.h>
using namespace std;
int e[505],d[505];
string ts(string a, int x, int y)
{
    vector<int> scr;
    for(int i = 0; i < a.size(); i++) scr.push_back(e[a[i]]);
    reverse(scr.begin(), scr.end());
    vector<int> res;
    while(scr.size())
    {
        int r = 0;
        for(int i = scr.size() - 1; i >= 0; i--)
        {
            scr[i] += r * x;
            r = scr[i] % y;
            scr[i] /= y;
        }
        res.push_back(r);
        while(scr.size() > 0 && *scr.rbegin() == 0) scr.pop_back();
    }
    reverse(res.begin(), res.end());
    string b = "";
    for(auto &i : res) b += (char)d[i];
    return b;
}
int main()
{
    int cnt = 0;
    for(int i = '0'; i <= '9'; i++) e[i] = cnt,d[cnt] = i, cnt++;
    for(int i = 'A'; i <= 'Z'; i++) e[i] = cnt,d[cnt] = i, cnt++;
    for(int i = 'a'; i <= 'z'; i++) e[i] = cnt,d[cnt] = i, cnt++;
    int n; cin >> n;
    for(int i = 1; i <= n; i++)
    {
        vector<int> ans;
        int a,b; cin >> a >> b;
        string s; cin >> s;
        cout << a << " " << s <<endl;
        cout << b << " " << ts(s, a, b) << endl << endl;;
    }
}

发表评论

邮箱地址不会被公开。 必填项已用*标注