0%

进制间的转化

进制转换是 OI 考试必考无疑的一块内容,一般出现在选择题中比较大小,对于这种情况,我们一般都转化为十进制进行比较

另外,对于 n 进制转 m 进制,一般可以将 n 进制转化为十进制二进制,再把转换好的数再转化为 m 进制

注意,下面提的两种转换方法所操作的数字要求都是正数

为什么我要提二进制?

任意进制转十进制(按权展开求和)

举个例子,将二进制1011.01转换为十进制

对应2的次方 23 22 21 20 2-1 2-2
原始数据 1 0 1 1 . 0 1
处理过程 1×23 0×22 1×21 1×20 0×2-1 1×2-2
相乘结果 8 0 2 1 0 0.25

所以处理结果就是将相乘结果加起来8+0+2+1+0+0.25=11.25

二进制1011.01的十进制就是11.25

个位上 2 的次方为 0,左边位数上的次方递增,右边位数上的次方递减

总结一下:将任意进制(R)转换为十进制,我们只需要按权展,每位上数字乘权值之和就是答案(权值为 R**x**,个位 x=0,左边 x 递增,右边 x 递减)

十进制转任意进制

如果是一个小数,就需要分两个部分计算,整数部分和小数部分,最后加起来就行了,比如十进制89.8125的二进制就是1011001 + 0.1101 = 1011001.1101

整数部分(短除反取余法):

例:将十进制89转换为二进制

2 89 2 44 2 22 2 11 2 5 2 2 2 1 0 ……1 ……0 ……0 ……1 ……1 ……0 ……1

把右边的余数从下到上排列所得的1011001就是答案

同理,将十进制转换为任意进制 R,我们只需要不停短除 R 直到商为 0,将每步余数从下到上依次排列就是答案

小数部分(乘 R 取整法):

请注意每次乘的因数就为小数部分(除灰色外)

0.8125 × 2 1 .625 ……1 ……1 ……0 ……1 × 2 0 .5 × 2 1 .0 × 2 1 .25

同理,设进制为 R,将其(第一步为本身,接下来为商的小数部分)不断乘 R 直到商的小数部分为 0,将每步取整后顺序排列即为答案

进制的正整数转换为 m 进制的程序

拓展一个思路吧,这个程序有局限性,被转换的数只能是正整数

伪代码

int n   # 输入 n 进制
int m   # 输出 m 进制

int x   # 待转换数


# 读入 
int t
while 输入
    t *= n
    t += 到十进制(getchar()) # > 9 字母变两位数


# 输出
function oput(k)
    if (!k) return
    oput(k / m)
    print 到相应字母(k % m) # “到相应字母”:0~9直接输出数字 > 9 变字母

题外话

这时候你可能会问,如何进行负数间的转化?

其实原理是一样的,只不过需要将结果变为补码

这时候二进制的优势就凸显出来了

编写时间苍茫,可能含有错误,欢迎指出

  • 本文作者: rcxzsc
  • 本文链接: https://rcxzsc.com/archives/674/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY 许可协议。转载请注明出处!