对于这个问题,首先需要注意的是数据范围,题目说整数长度不超过1000,我们可以认为最大数据有1000位,这远远超过了任何一种数据类型,因此这么大的两个数据相加要设计算法才能实现。
我们可以先将数字转化为字符串储存在字符数组中,因为数字计算从末位开始并向前进位,所以我们先将数组倒置后再从数组下标为0的位置开始相加,相加后的和对10取余即为相加结果在该位置的数字,相加后的和除以10所得的商即为向前一位的进位,如此循环即可。
#include<stdio.h>
#include<string.h>
void reverse(char a[])//函数功能:将数组倒置
{
int i,len=strlen(a),temp;
for(i=0;i<len/2;i++)
{
temp=a[i];
a[i]=a[len-1-i];
a[len-1-i]=temp;
}
}
void add(char a[],char b[],char c[])//函数功能:大数相加
{
int len1=strlen(a),len2=strlen(b),i,m,l=0;
reverse(a);
reverse(b);
for(i=0;i<len1&&i<len2;i++)
{
m=(a[i]-'0'+b[i]-'0'+l)%10;//m是这一位的数,l是向前进位数
l=(a[i]-'0'+b[i]-'0'+l)/10;
c[i]=m+'0';
}
if(i<len1)
{
for(;i<len1;i++)
{
m=(a[i]-'0'+l)%10;
l=(a[i]-'0'+l)/10;
c[i]=m+'0';
}
}
if(i<len2)
{
for(;i<len2;i++)
{
m=(b[i]-'0'+l)%10;
l=(b[i]-'0'+l)/10;
c[i]=m+'0';
}
}
if(l)//最后一位进位
c[i++]=l+'0';
c[i]='\0';
}
int main()
{
int t,i,j,len;
scanf("%d",&t);
for(j=1;j<=t;j++)
{
char a[1001],b[1001],c[1002];
scanf("%s%s",&a,&b);
add(a,b,c);
len=strlen(c);
reverse(a);
reverse(b);
printf("Case %d:\n%s + %s = ",j,a,b);
for(i=len-1;i>=0;i--)
printf("%c",c[i]);
printf("\n");
if(j<t)
printf("\n");
}
return 0;
}