欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

进制转换

程序员文章站 2022-04-06 15:32:36
...

对一个P进制的数,如果要转换为Q进制,需要分两步:

(1)将P进制数转换为十进制数y。

对一个十进制数y=d1d2…dn,它可以写成如下形式:

                                y=d1*10^(n-1)+d2*10^(n-2)+…+d(n-1)*10+dn

同样的,如果P进制数为a1a2…an,那么它写成下面这个形式之后使用十进制的加法和乘法,就可以转换为十进制数y:

                                y=a1*P^(n-1)+a2*P^(n-2)+…+a(n-1)*P+an

具体实现如下:

int y=0,product=1;     //product在循环中会不断乘P,得到1、P、P^2、P^3...
while(x!=0){
    y=y+(x%10)*product;  //x%10是为了每次获取x的个位数
    x=x/10; //去掉x的个位
    product=product*P;;
}

(2)将十进制数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的二进制数。

由此可以得到实现的代码(将十进制数y转换为Q进制,结果存放于数组z):

int z[40],num=0;//数组存放Q进制数y的每一位,num为位数
do{
    z[num++]=y%Q;
    y=y/Q;
}while(y!=0);

这样z数组从高位z[num-1]到低位z[0]即为Q进制z,进制转换完成。值得注意的是,代码使用do…while语句而不是while语句的原因是:如果十进制数y恰好等于0,那么while语句将使循环直接跳出,导致结果出错(正确结果应当是数组z中存放了z[0]=0)。

内容来源:《算法笔记》

扩展阅读:

二、八、十、十六进制转换(图解篇) http://www.cnblogs.com/gaizai/p/4233780.html#_labelContexts

相关标签: 进制转换