进制间的转化

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

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

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

为什么我要提二进制?

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

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

对应2的次方232221202-12-2
原始数据1011.01
处理过程1×230×221×211×200×2-11×2-2
相乘结果802100.25

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

二进制1011.01的十进制就是11.25

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

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

2.十进制转任意进制

如果是一个小数,就需要分两个部分计算,整数部分和小数部分,最后加起来就行了

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

例:将十进制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将余数从下到上依次排列即可(将上面那个例子红色的2改成R)

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

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

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

同理,设进制为R,那么则将小数乘R,每次取整数位上的数,再把小数部分的数继续成R,直到小数部分为0。每次结果取整,顺序排列既是答案(将上面那个例子红色的2改成R)

3.进制的正整数转换为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 变字母

4.题外话

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

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

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

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

本站遵循「CC BY 4.0」创作共享协议,转载请注明出处