超级简单L1-3 宇宙无敌加法器 (20分)

L1-3 宇宙无敌加法器 (20分)

地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 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 数之和。

输入样例:
30527
06203
415
输出样例:
7201

思路:这道题并不难,仔细一点就能一次AC了,因为输入的数字首位可能为0,所以选择用字符串,这里我们用三个字符数组分别表示输入的进制表和两个加数,还需要一个字符数组来存储我们的结果,进位的话用一个标识变量来表示就OK了。

具体操作:写一个while循环,从两个加数的最后一位开始相加,相加的结果对相对应的进制数取余得到我们要的数存在结果字符数组里,相加的结果除以进制数得到进位,然后依次前进一位,以此类推,直到第一位,需要注意的是:第一位相加得到的进位不为0的话一定要加上,为0的话,还需要判断第一位的结果是否为零,因为题目需要考虑到整个结果为零的情况,否则会有测试点无法通过。

接下来看代码实现:

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int lena,lenb,lens;//分别表示第一个加数,第二个加数和数字进制表
    int flag=0;//进位标记
    char a[1000],b[1000],s[1000],ans[1000];//最后一个数组用来存储结果
    cin>>s;//这里因为是字符数组,getchar()可加可不加
    cin>>a;
    cin>>b;
    lena=strlen(a)-1;//最后一位的下标
    lenb=strlen(b)-1;//同上
    lens=strlen(s)-1;//同上
    while(lens!=-1)//当数字进制表长度为-1时退出循环
    {
        int sum=0;//相加的总和
        if(lena>=0)
        {
            sum+=a[lena]-'0';
        }
        if(lenb>=0)
        {
            sum+=b[lenb]-'0';
        }
        lena--;lenb--;//长度减一,往前走
        sum+=flag;//相加结果要加上上一位的进位
        if(s[lens]=='0')
            s[lens]+=10;//十进制的情况,因为进制表里用0表示,所以要加上10
        ans[lens]=sum%(s[lens]-'0')+'0';//取余得到的结果存在ans数组里,注意要加上'0'转换为字符
        flag=sum/(s[lens]-'0');//更新进位
        lens--;
    }
    int st=0;
    if(flag!=0)//两数第一位相加后结果的进位不为0
    {
        st=1;//更新标识
        printf("%d",flag);//直接输出进位
    }   
    for(int i=0;i<strlen(s);i++)
    {   
        if(ans[i]!='0')
            st=1;
        else{
            if(!st)//如果第一位的结果为0,进位也为0,跳过语句,直接进行下一次循环,因为题目要求结果前面没有0
                continue;
        }
        printf("%c",ans[i]);//否则的话就输出
    }   
    if(st==0)//整个相加结果为0的情况
        printf("0");
    return 0;
 }

总结:仔细审题,注意结果为0的情况,考虑所有情况,你也能一次AC哦!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值