PAT-B 1022. D进制的A+B (20)
2017-02-18 22:23
176 查看
题目链接在此
将P进制的数X转换成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
可用下面这个循环实现:
再来看一下第二步 — — 将十进制数Y转换成Q进制Z:
采用“除基取余法”。“基”就是将要转换的进制Q,因此除基取余的意思就是:每次将待转换数除以Q,然后将得到的余数作为低位存储,将商继续除以Q并进行上面的操作,直到商为0。
下面是实现代码(将十进制数Y转换成Q进制,结果保存在数组Z)
注意:这里用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的情况
进制转换通法
在记录题目之前,先记录一下进制转换的通用方法。将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; }
相关文章推荐
- 1022. D进制的A+B (20) PAT乙级真题
- PAT乙级.1022. D进制的A+B (20)
- PATBasic——1022. D进制的A+B (20)
- PAT-B 1022. D进制的A+B (20)
- PAT 乙级 1022 D进制的A+B (20)
- PAT 乙级 1022. D进制的A+B (20)
- PAT---B1022. D进制的A+B (20)
- PAT(B)1022. D进制的A+B (20)
- [PAT乙级]1022. D进制的A+B (20)
- 1022. D进制的A+B (20) PAT
- 1022. D进制的A+B (20)--PAT乙级
- (PAT-Basic)1022. D进制的A+B (20)
- PAT乙级1022. D进制的A+B (20)
- 1022. D进制的A+B (20)-浙大PAT乙级真题java实现
- PAT乙级—1022. D进制的A+B (20)-native
- PAT 乙级 1022.D进制的A+B(20)
- PAT B 1022. D进制的A+B (20)
- PAT --- 1022. D进制的A+B (20)
- PAT乙题1022. D进制的A+B (20)
- PAT1022 D进制的A+B (20)