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

本文详细介绍了一种通用的进制转换方法,包括从P进制到十进制的转换及从十进制到Q进制的转换。通过具体的算法实现,帮助读者理解进制转换的基本原理。

题目链接在此

进制转换通法

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

将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;
}
地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。理论上这个进制表应该包含无穷多位数字,但从实际应用出发,PAT 星人通常只需要记住前 20 位就够用了,以后各位默认为 10 进制。在这样的数字系统中,即使是简单的加法运算也变得不简单。例如对应进制表“0527”,该如何计算“6203 + 415”呢?我们得首先计算最低位:3 + 5 = 8;因为最低位是 7 进制的,所以我们得到 1 和 1 个进位。第 2 位是:0 + 1 + 1(进位)= 2;因为此位是 2 进制的,所以我们得到 0 和 1 个进位。第 3 位是:2 + 4 + 1(进位)= 7;因为此位是 5 进制的,所以我们得到 2 和 1 个进位。第 4 位是:6 + 1(进位)= 7;因为此位是 10 进制的,所以我们就得到 7。最后我们得到:6203 + 415 = 7201。输入格式:输入首先在第一行给出一个 N 位的进制表(0 < N ≤ 20),以回车结束。 随后两行,每行给出一个不超过 N 位的非负的 PAT 数。输出格式:在一行中输出两个 PAT 数之和。(用C语言编写程序)
最新发布
03-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值