ZCMU 1411 喜闻乐见的a+b

Problem E: 喜闻乐见的a+b

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 386  Solved: 144
[Submit][Status][Web Board]

Description

喜闻乐见的a+b来了,当然二进制,八进制,十进制什么的估计你们也懒得写了,来个20进制的a+b

 

 

Input

         给出多组a和b,每个数字一行

数字由0~9和小写字母a~j(10~19)

给出的长度不超过100

 

 

Output

每组数据输出a+b的和。

 

Sample Input

1234567890

abcdefghij

99999jjjjj

9999900001

Sample Output

bdfi02467j

iiiij00000

 

题目大意: 输入两个20进制下的数,求和。要求测试多组数据。

思路: 先用两个字符数组储存输入的两个数,考虑用循环把20进制的数转化成十进制存入两个整型数组a1,b1中。由于存在两个数的长度关系不确定的情况,使len = max(len1,len2),再用循环把对应位上的数求和存入一个新数组c[ i ] 中,若产生进位则c[ i ]  = c[ i ] - 20 , c[ i + 1 ] ++ 。数组c即为这两个数在十进制下的和,根据c [ i ] 的值输出对应的符号即可。

完整代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main ()
{
    char a1[10000],b1[10000];
    int a[10000],b[10000],c[10000];
    int k,m,n,x,ans,flag;
    while(~scanf("%s",a1))
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        scanf("%s",b1);
        int len1=strlen(a1),len2=strlen(b1);
        for(int i=len1-1;i>=0;i--){           // 把20进制转化成10进制
            if(a1[i]>='0'&&a1[i]<='9')
                a[len1-1-i]=a1[i]-'0';
            else if(a1[i]>='a'&&a1[i]<='j')
                a[len1-1-i]=a1[i]-'a'+10;
        }
        for(int i=len2-1;i>=0;i--){
            if(b1[i]>='0'&&b1[i]<='9')
                b[len2-1-i]=b1[i]-'0';
            else if(b1[i]>='a'&&b1[i]<='j')
                b[len2-1-i]=b1[i]-'a'+10;
        }
        int len=len1;
        if(len<len2){                 // 取最大长度进行循环
            len=len2;
        }
        for(int i=0;i<len;i++){        //通过循环进行求和存入数组c中
            c[i]=a[i]+b[i]+c[i];
            if(c[i]>=20){
                c[i]=c[i]-20;c[i+1]++;    // 进位的情况
            }
        }
        int flag=max(len1,len2)+2;
        while(c[flag]==0&&flag>=0)      // 因为前面已经将数组c全部置0,这里需要判断数组c的长度
            flag--;
        if(flag<0)
            printf("0\n");
        else{
            for(int i=flag;i>=0;i--)    //根据c[i]的值输出对应的符号
            {
                if(c[i]<=9)
                    printf("%d",c[i]);
                else
                    printf("%c",c[i]-10+'a');
            }
            printf("\n");
        }
  
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值