进制转换
对一个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
上一篇: C++STL学习——List容器