分析:
本题要求进行100位以内的二十进制数字相加运算。加数和被加数的长度不一定相等。超长数字的相加,我们用字符串来处理。
先将两个字符串反转,再从第0位开始到末尾,两位依次相加,如果两位相加的结果超过19,那么需要向下一位产生进位。
最后将结果数组反转输出即可。注意字符转为数字的做法,如果字符本身是数字,减‘0’即可,如果是字母,减‘a’ + 10。
代码:
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000],b[1000]; //大数用字符串存起来
int c[1000];
int n1,n2,i,j,max,sum,min;
while(scanf("%s%s",a,b)!=EOF)
{
memset(c,0,sizeof(c));
n1=strlen(a);n2=strlen(b);
if(n1>n2) {max=n1;min=n2;}
else {max=n2;min=n1;}
for(i=0;i<n1;i++) //将字符转换成数字 a数组
{
if(a[i] >='a'&&a[i]<='j') //如果是字符
a[i]=a[i]-'a'+10;
if(a[i]>='0'&&a[i]<='9') //如果是数字
a[i]=a[i]-48;
}
for(i=0;i<n2;i++) //处理b数组 转换成数字
{
if(b[i] >='a'&&b[i]<='j')
b[i]=b[i]-'a'+10;
if(b[i]>='0'&&b[i]<='9')
b[i]=b[i]-48;
}
int a1[1000],b1[1000];
memset(a1, 0, sizeof(a1));
memset(b1, 0, sizeof(b1));
for(i=n1-1,j=0;i>=0;i--,j++) //反转数组a
a1[j]=a[i];
for(i=n2-1,j=0;i>=0;i--,j++) //反转b
b1[j]=b[i];
for (i=0;i<max;i++) //模拟进位,倒序相加
{
c[i]+=a1[i]+b1[i];
if(c[i]>19)
{
c[i+1]++;
c[i]-=20;
}
}
for (i=999; i>=0 ; i--)
{
if (c[i]) //倒序找到 非零位置
{
max=i;
break;
}
if (i==0)
max=0;
}
for(i=max;i>=0;i--)
{
if(c[i]<10) printf("%d",c[i]); // 倒序输出
else if(c[i]==10) printf("a");
else if(c[i]==11) printf("b");
else if(c[i]==12) printf("c");
else if(c[i]==13) printf("d");
else if(c[i]==14) printf("e");
else if(c[i]==15) printf("f");
else if(c[i]==16) printf("g");
else if(c[i]==17) printf("h");
else if(c[i]==18) printf("i");
else if(c[i]==19) printf("j");
}
printf("\n");
}
return 0;
}