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

· · 题解

欢迎报名洛谷网校,报名课程可以获得对应组别的知识点讲解与答疑服务,期待和大家一起进步!点击图片即可报名。

:::align{center} :::

我们从要转换的十进制数 N 开始。只要 N 还大于 0,我们就重复进行两个步骤:第一,计算 N 除以进制数 R 的余数,这个余数就是新进制数中最右边(最低位)的那个数字;第二,将 N 更新为它除以 R 后的商(即整除的结果),为下一次计算做准备。我们把每次得到的余数记录下来,直到 N 最终变为 0 为止。

这里有一个关键点:我们通过这个方法得到的数字顺序,是“从右到左”的,也就是先得到个位,再得到十位,以此类推。但我们输出的时候,需要“从左到右”的正确顺序。因此,我们需要一个地方先把这些计算出来的数字暂存起来。一个静态数组就是非常好的选择。我们可以每算出一个新进制的数位,就把它存进数组里。

另外,题目要求当数位大于等于 10 时,要用 A, B, C 等字母来表示。A 代表 10,B 代表 11,一直到 Z 代表 35。这个转换也很简单:如果计算出的余数小于 10,它就是一个普通的数字;如果余数大于等于 10,我们就需要把它转换成对应的字母。例如,如果余数是 10,它对应的字母就是 A;如果是 11,就是 'B'。我们可以发现一个规律:第 r 个数字(r >= 10)对应的字母,就是从 'A' 开始数的第 r - 10 个字母。

当整个计算过程结束后,我们只需要将存放在数组里的结果,从后往前依次输出,就能得到最终的、顺序正确的 R 进制数了。

while (________) {
    ________; // 完成进制转换
    if (________) {
        ans[cnt] = ________; // 直接存入数组
    } else {
        ans[cnt] = ________; // 数位大于等于 10 时,转换为数字后输出
    }
}
for (________)
    ________; // 倒序输出存放在答案数组的结果