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;
}