这道题的本质就是两个超级大数相加。光是用long long类型的整型是搞不定的。
由于题目已经说明数字不会超过1000位,所以可以采用顺序表来进行数据的存储和相加。值得注意的是,由于数字位数的不确定,数组中存储从数组最后一位开始存,后续需要将有效位数倒置处理。
代码如下:
#include<stdio.h>
#define MAXL 1000
void read(int a[])
{
char x=getchar();
int i=MAXL-1,n=0;
while('0'<=x && x<='9')
{
a[i]=(int)(x-'0');
i--;
n++;
x=getchar();
}
for(int j=0;j<n/2;j++)
{
int k=a[i+j+1];
a[i+j+1]=a[MAXL-j-1];
a[MAXL-j-1]=k;
}
}
void print(int a[])
{
int flag=1;
for(int i=0;i<MAXL;i++)
{
if(a[i]==0 && flag)
continue;
else
{
flag=0;
printf("%d",a[i]);
}
}
}
void printSum(int a[],int b[])
{
int c[MAXL]={0};
for(int i=MAXL-1;i>0;i--)
{
if(c[i]+a[i]+b[i]>=10)
{
c[i]+=a[i]+b[i]-10;
c[i-1]++;
}else{
c[i]+=a[i]+b[i];
}
}
print(a);
printf(" + ");
print(b);
printf(" = ");
print(c);
printf("\n");
}
int main()
{
int n;
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
int a[MAXL]={0};
int b[MAXL]={0};
if(i!=0)
{
printf("\n");
}
read(a);
//print(a);
read(b);
//print(b);
printf("Case %d:\n",i+1);
printSum(a,b);
}
return 0;
}