本文主要解决对于两个不同进制的数字如何转换
对于一个P进制的数,如果想要转换为Q进制,需要分两步
1.将P进制数字x转换为10进制数y。
对于一个十进制的数
y
=
d
1
d
2
.
.
.
d
n
y=d_1d_2...d_n
y=d1d2...dn ,它可以写成:
y
=
d
1
∗
1
0
n
−
1
+
d
2
∗
1
0
n
−
2
+
.
.
.
+
d
n
−
1
∗
10
+
d
n
y=d_1*10^{n-1}+d_2*10^{n-2}+...+d_{n-1}*10+d_n
y=d1∗10n−1+d2∗10n−2+...+dn−1∗10+dn
同样的,P进制数x为
a
1
a
2
.
.
.
a
n
a_1a_2...a_n
a1a2...an ,那么它写成下面这个形式之后使用十进制的加法和乘法,就可以转换为十进制数
y
1
y_1
y1:
y
=
a
1
∗
P
n
−
1
+
a
2
∗
P
n
−
2
+
.
.
.
+
a
n
−
1
∗
P
+
a
n
y=a_1*P^{n-1}+a_2*P^{n-2}+...+a_{n-1}*P+a_n
y=a1∗Pn−1+a2∗Pn−2+...+an−1∗P+an
例如:
注意要倒着乘
将P进制数字x转换为10进制数y 代码实现
int y=0, product=1;
while(x != 0){
y = y + (x % 10) * product;
x = x / 10;
product = product * p;
}
2.将十进制数y转换为Q进制数z。
采用”除基取余法“,所谓的“基”就是指将要转换成的进制Q,因此除基取余的意思就是每次将待转换数除以Q,然后将得到的余数作为低位储存,而商则继续除以Q并进行上面的操作,最后当商为0时,将所有位从高到低输出就可以得到z
例子:
将十进制数11,转换为二进制数
将十进制数y转换为Q进制数z 代码实现
int z[40], num= 0;//数组z存放进制数z的每一位,num为位数
do{
z[num++] = y % Q;//除基取余
y = y / Q;
}while(y != 0);//当商不为0时候进行循环
注意:输出时要从后往前输出结果:for(int i=num-1;i>=0;i--) cout<<z[i];
这样z数组从高位z[num-1]到低位z[0]即为Q进制z,进制转换完成,值得注意的是,代码中使用do…while语句而不是用while语句的原因是:如果十进制数y恰好等于0,那么使用while语句将使循环直接跳出,导致结果出错(正确结果应当是数组z中存放了z[0]=0)。