题目链接在此
进制转换通法
在记录题目之前,先记录一下进制转换的通用方法。
将P进制的数X转换成Q进制的Z,需要两步:
1. 将P进制的X转换成十进制的Y
2. 将十进制的Y转换成Q进制的Z(除基取余法)
先来看看第一步 — — 将P进制的X转换成十进制的Y:
我们知道,比如一个十进制的数K=DnDn-1……D3D2D1,我们可以表示为Y=Dn*10^(n-1) + Dn-1*10^(n-2) + …… + D2*10 + D1
那么以此类推,若P进制数X=AnAn-1……A2A1,把它写成下面这个形式之后使用十进制的加法和乘法,我们就能得到P的十进制数
Y = An*P^(n-1) + An-1*P^(n-2) + …… +A2*P + A1
可用下面这个循环实现:
int y = 0, product = 1;
while(x != 0){
y += (x%10) * product;
x /= 10;
product *= P;
}
再来看一下第二步 — — 将十进制数Y转换成Q进制Z:
采用“除基取余法”。“基”就是将要转换的进制Q,因此除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,将商继续除以Q并进行上面的操作,直到商为0。
下面是实现代码(将十进制数Y转换成Q进制,结果保存在数组Z)
int z[40], num = 0 //num为位数
do{
z[num++] = Y%Q;
Y /= Q;
}while(Y != 0)
注意:这里用do…while结果而不用while结构是因为,当Y为0时,正确结果应该是z[0]=0,而while结构会直接退出,不会执行这一步。故使用while结构需要特判Y==0的情况。
题目思路
相信一般步骤明白了之后自然就会解这道题了,直接用“除基取余法”即可。
但是有几点需要注意的地方:
1. int的数据范围是-2^31 ~ +2^31 - 1,所以正好用int存输入即可
2. 由于D的范围是(1,10],当D为2时存入结果数组的位数最多,此时为31位,故product数组的大小最小应该为31
3. 若使用while结构,需要特判a+b == 0的情况
AC代码
#include<stdio.h>
int main(){
int a,b,d,res;
scanf("%d %d %d",&a, &b, &d);
res = a+b;
//将res转换成d进制
int num = 0, product[31];
do{
product[num++] = res%d;
res /= d;
} while(res != 0);
//如果改用while结构,则a+b==0时需要特判
// while(res){
// product[num++] = res % d;
// res /= d;
// }
// if(res == 0) product[0] = 0;
for(int i = num-1; i >= 0; i--){
printf("%d",product[i]);
}
return 0;
}