3.5-进制转换
对于一个P进制的数,如果要转换为Q进制的数,需要分为两步:
①将P进制数x转换为十进制数y
对于一个十进制数y=d1d2···dn,可以将其写为:
y = d1 * 10n-1 + d2 * 10n-2 + ··· + dn-1 * 10 + dn |
对于P进制数x,如果其形式为a1a2···an,则可以将其写为:
x = a1 * Pn-1 + a2 * Pn-2 + ··· + an-1 * P + an |
在该形式下,可以有如下代码将P进制数x转为十进制数y:
1 int y=0,product=1;//product 在循环中会不断乘p,得到1、P、P^2、P^3···· 2 while(x!=0){ 3 y=y+(x%10)* product;//x%10是为了每次获取x的个位数 4 x=x/10;//去掉x的个位 5 product=product*P; 6 }
②将十进制数y转换为Q进制数z
采用“除基取余法”。“基”就是指将要转换成的进制Q的数值,所以“除基取余法”就是 每次将待转换的十进制数除以Q,然后将得到的余数作为低位存储,所得的商继续除以Q并进行上面的操作,最后当商为0时,将所有的余数从高到低进行输出就可以得到z。
举例:将十进制数11转换为二进制数
11除以2,得商为5,余数为1; 5除以2,得商为2,余数为1;2除以2,得商为1,余数为0; 1除以2,得商为0,余数为1,算法终止。 将余数从后往前输出,得1011即为11的二进制数。 |
转换代码:
1 int z[40],num=0;//数组z存放Q进制数y的每一位,num为位数 2 do{ 3 z[num++]=y%Q;//除基取余 4 y=y/Q; 5 }while(y!=0);//当商不为0时进行循环 6 //数组从高z[num-1]到低z[0]输出即为Q进制z,进制转换完成。 7 //使用do···while语句而不是while语句:如果当十进制数y等于0, 8 //那么使用while语句的代码将使循环直接跳出,导致出错(正确的 9 //结果应当是数组z中存放了z[0]=0)
参考书籍-《算法笔记》-胡凡