算法笔记—进制转换

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/m0_37345402/article/details/82904626
今日推荐