您的位置:首页 > 其它

PAT-B 1022. D进制的A+B (20)

2017-02-18 22:23 176 查看
题目链接在此

进制转换通法

在记录题目之前,先记录一下进制转换的通用方法。

将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<st
4000
dio.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: