AcWing 3374. 进制转换2

26

高精度

题目

将 $M$ 进制的数 $X$ 转换为 $N$ 进制的数输出。

输入格式
第一行包括两个整数:$M$ 和 $N$。
第二行包含一个数 $X$,$X$ 是 $M$ 进制的数,现在要求你将 $M$ 进制的数 $X$ 转换成 $N$ 进制的数输出。

输出格式
共一行,输出 $X$ 的 $N$ 进制表示。

数据范围
$2≤N$,$M≤36$,
$X$ 最多包含 $100$ 位。
在输入中,当某一位数字的值大于 $10$(十进制下)时,我们用大写字母 $A∼Z$,分别表示(十进制下的)数值 $10∼35$。
在输出中,当某一位数字的值大于 $10$(十进制下)时,我们用小写字母 $a∼z$,分别表示(十进制下的)数值 $10∼35$。

输入样例:

10 2
11

输出样例:

1011

知识点

短除法实现

// A的长度不是0的时候
while (A.size())
{
    int r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        // 商
        A[i] += r * a;
        // r保存余数
        r = A[i] % b;
        // 商
        A[i] /= b;
    }
    // 删除前导0
    while (A.size() && A.back() == 0) A.pop_back();
    if (r < 10) res += to_string(r);
    else res += r - 10 + 'a';
}

题解

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int a, b;
    string s;
    cin >> a >> b >> s;
    vector<int> A;
    for (int i = 0; i < s.size(); i ++ )
    {
        char c = s[s.size() - 1 - i];
        if (c >= 'A') A.push_back(c - 'A' + 10);
        else A.push_back(c - '0');
    }
    string res;
    if (s == "0") res = "0";
    else
    {
        while (A.size())
        {
            int r = 0;
            for (int i = A.size() - 1; i >= 0; i -- )
            {
                A[i] += r * a;
                r = A[i] % b;
                A[i] /= b;
            }
            while (A.size() && A.back() == 0) A.pop_back();
            if (r < 10) res += to_string(r);
            else res += r - 10 + 'a';
        }
        reverse(res.begin(), res.end());
    }
    cout << res << endl;

    return 0;
}