Problem E: 喜闻乐见的a+b
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 390 Solved: 146
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; }