zcmu1411 / 训练赛3-Problem E: 喜闻乐见的a+b

Problem E: 喜闻乐见的a+b

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 390  Solved: 146

[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

  • 定义5个数组,a[]、b[]分别代表两个输入的字符串,aa[],bb[],cc[]分别为a逆序、b逆序的int型数组存储逆序的每一位所对应的十进制整数,cc[]为两数组各个位相加所得数,注意进位;

  • 由于是加法,最多进1,乘法则不一定是1了;

  • 由于末尾可能会有0,逆序之后0就会出现在前几位,cc的前几个数组可元素以为0,但是后几个不可能是0,所以让flag+2进入循环,直到flag对应的元素不为0,做加法运算后所得首位输出;

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 10000;
    char a[maxn],b[maxn];
    int aa[maxn],bb[maxn],cc[maxn]; 
    int main()
    {
    	while(~scanf("%s%s",a,b))
    	{
    		int len1=strlen(a),len2=strlen(b);
    		for(int i=len1-1;i>=0;i--)
    		{
    			if(a[i]>='0'&&a[i]<='9')aa[len1-1-i]=a[i]-'0';
    			else if(a[i]>='a'&&a[i]<='j')aa[len1-1-i]=a[i]-'a'+10;
    		}
    		for(int i=len2-1;i>=0;i--)
    		{
    			if(b[i]>='0'&&b[i]<='9')bb[len2-1-i]=b[i]-'0';
    			else if(b[i]>='a'&&b[i]<='j')bb[len2-1-i]=b[i]-'a'+10;
    		}
    		int len=max(len1,len2);
    		for(int i=0;i<len;i++)
    		{
    			cc[i]+=aa[i]+bb[i];
    			if(cc[i]>=20)
    			{
    				cc[i]-=20;	//如果大于20 
    				cc[i+1]++;	//下一位+1 
    			}
    		}
    		int flag=len+2;	//
    		while(cc[flag]==0&&flag>=0)flag--;
    		if(flag<0)cout<<"0\n";
    		else{
    			for(int i=flag;i>=0;i--)
    			{
    				if(cc[i]<=9)cout<<cc[i];
    				else printf("%c",cc[i]-10+'a');
    			}
    			cout<<endl;
    		}
    		memset(aa,0,sizeof(aa));
    		memset(bb,0,sizeof(bb));
    		memset(cc,0,sizeof(bb));
    	}
       
       return 0;
    }

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81180597