算法笔记―进制转换

匿名 (未验证) 提交于 2019-12-02 22:56:40
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37345402/article/details/82904626

 

对两个不同进制, 应该如何进行相互转换?
对于一个P进制的数, 如果要转换为 Q 进制, 需要分为两步:

①将 P 进制数x转换为十进制数y。

对于一个十进制的数Y = d1d2 … dn ,它可以写成这个形式:

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

通过循环来实现

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

 

②将十进制数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 进制, 结果存放于数组a中

int a[111]; int num=0;//余数的位数 do{ 	a[num++]=y%q;//除基取余 	y/=q;  } while(y!=0) //当商不为0时进行循环

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

 

例:PAT(B)D进制的A+B (20)

 https://blog.csdn.net/m0_37345402/article/details/81322117

 

转载请标明出处:算法笔记―进制转换
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!