专栏文章

B3849 [GESP样题 三级] 进制转换

B3849题解参与者 8已保存评论 10

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
10 条
当前快照
1 份
快照标识符
@mio0x0hp
此快照首次捕获于
2025/12/02 11:33
3 个月前
此快照最后确认于
2025/12/02 11:33
3 个月前
查看原文
欢迎大家报名洛谷网校的课程,期待和大家一起进步!

我们从要转换的十进制数 NN 开始。只要 NN 还大于 0,我们就重复进行两个步骤:第一,计算 NN 除以进制数 RR 的余数,这个余数就是新进制数中最右边(最低位)的那个数字;第二,将 NN 更新为它除以 RR 后的商(即整除的结果),为下一次计算做准备。我们把每次得到的余数记录下来,直到 NN 最终变为 0 为止。
这里有一个关键点:我们通过这个方法得到的数字顺序,是“从右到左”的,也就是先得到个位,再得到十位,以此类推。但我们输出的时候,需要“从左到右”的正确顺序。因此,我们需要一个地方先把这些计算出来的数字暂存起来。一个静态数组就是非常好的选择。我们可以每算出一个新进制的数位,就把它存进数组里。
另外,题目要求当数位大于等于 10 时,要用 A, B, C 等字母来表示。A 代表 10,B 代表 11,一直到 Z 代表 35。这个转换也很简单:如果计算出的余数小于 10,它就是一个普通的数字;如果余数大于等于 10,我们就需要把它转换成对应的字母。例如,如果余数是 10,它对应的字母就是 A;如果是 11,就是 'B'。我们可以发现一个规律:第 r 个数字(r >= 10)对应的字母,就是从 'A' 开始数的第 r - 10 个字母。
当整个计算过程结束后,我们只需要将存放在数组里的结果,从后往前依次输出,就能得到最终的、顺序正确的 RR 进制数了。
CPP
while (n > 0) {
    int r = n % r;
    cnt++;
    if (r < 10) {
        ans[cnt] = r + '0';
    } else {
        ans[cnt] = r - 10 + 'A';
    }
    n = n / r;
}
for (int i = cnt; i >= 1; --i)
    cout << ans[i];

评论

10 条评论,欢迎与作者交流。

正在加载评论...