3.5 进制转换
我们一般只要知道如何将一个x进制的数转换成十进制,和十进制如何转换成x进制数即可。若是想要将P进制的数转换成Q进制的数,我们可以先将P进制的数转换成十进制,然后将十进制转换成Q进制。
- 将P进制转换成十进制
对于一个十进制的数,如123456,我们可以写成下面的形式:
(
123456
)
10
=
1
∗
1
0
5
+
2
∗
1
0
4
+
3
∗
1
0
3
+
4
∗
1
0
2
+
5
∗
1
0
1
+
6
∗
1
0
0
(123456)_{10} = 1*10^5 + 2*10^4 + 3*10^3 + 4*10^2 + 5*10^1 + 6*10^0
(123456)10=1∗105+2∗104+3∗103+4∗102+5∗101+6∗100
每个数字对应的10的指数都是自己从右开始数的位置数减一。比如6从右边开始数位于这个数的第一个位置,所以它的指数是
1
−
1
=
0
1-1=0
1−1=0。
同样的,对于
P
P
P进制的数
x
=
a
n
a
n
−
1
a
n
−
2
⋯
a
2
a
1
x=a_na_{n-1}a_{n-2} \cdots a_2a_1
x=anan−1an−2⋯a2a1想转换成十进制,我们可以照葫芦画瓢:
(
y
)
10
=
a
n
∗
P
n
−
1
+
a
n
−
1
∗
P
n
−
2
+
a
n
−
2
∗
P
n
−
3
+
⋯
+
a
2
∗
P
1
+
a
1
∗
P
0
(y)_{10} = a_n*P^{n-1} + a_{n-1}*P^{n-2} + a_{n-2}*P^{n-3} + \cdots + a_2*P^1 + a_1*P^0
(y)10=an∗Pn−1+an−1∗Pn−2+an−2∗Pn−3+⋯+a2∗P1+a1∗P0
这个转换我们可以简单的用循环来实现:
// y用来存储最终转换成的十进制数
// product会在循环中不断乘以p,得到p的次方数
int y=0, product=1;
// x就是要转换的p进制数,当x还有位数没有处理就进入循环中
while(x != 0){
// 获得x的最后一位数,进行转换
y = y + (x%10) * product;
// 处理之后去掉x的最后一位数
x = x / 10;
// 得到下一个位数的p的次方数
product = product * p;
}
- 将十进制转换为Q进制
这里采用“除基取余法
”来实现转换。所谓的“基”就是进制Q,我们每次将十进制数除以Q,然后将余数作为最终Q进制数的低位进行存储,而商则继续除以Q并进行以上操作。当商为0时,将最终Q进制数进行从高到低输出就得到要求的Q进制数。
比如,将十进制数11转换成二进制:
// 数组z用来存放余数,num用来记录当前余数的位置
// 由于这里是从0开始按顺序存放余数,
// 所以输出的时候必须从最高位开始从右往左输出余数
int z[40], num=0;
// 由于这里需要先做除法再判断商是否为0,且十进制数可能是0,
// 所以用do……while循环更方便,能将结果0也存储下来
do{
// 存储每一次除法的余数
// 这里y为十进制数,Q表示要转换成的数为Q进制
z[num++] = y % Q;
// 保留每一次除法之后的商
y = y / Q;
}while(y != 0);
题目描述:
输入两个非负十进制整数 A A A和 B B B( ≤ 2 30 − 1 \leq 2^{30} - 1 ≤230−1)以及 D D D(进制数),输出 A + B A+B A+B的 D D D( 1 < D ≤ 10 1 < D \leq 10 1<D≤10)进制数。
输入格式:
在一行中依次给出三个整数 A A A、 B B B和 D D D(进制数)。
输出格式:
A + B A+B A+B的 D D D进制数。
样例输入:
123 456 8
样例输出:
1103
思路:
先计算两个十进制数的和,然后将和转换为D进制。这里可以用到上面说的“除基取余法”。
参考代码:
#include <cstdio>
int main(){
// a和b为十进制加数,D为要转换为的进制数
int a, b, D;
scanf("%d%d%d", &a, &b, &D);
// c存储a和b的和
int c = a+b;
// num数组存储余数,indx用来方便记录余数的个数
int num[31], indx=0;
// "除基取余法"
do{
num[indx++] = c % D;
c = c / D;
}while(c != 0);
// 从高到低输出余数,即为要转换成的D进制数
for(int i=indx; i>0; i--){
printf("%d", num[i-1]);
}
// 输出个换行符估计要好看些。。。
printf("\n");
return 0;
}