#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char a[10000],b[10000],c[10000];
char a1[10000],b1[10000];
char temp[10000],temp1[1000];
#define max(a,b) a>b? a:b
#define min(a,b) a<b? a:b
void reverse(char a[])
{
char d[10000];
int len=strlen(a);
int j=len-1;
for(int i=0;i<len;i++)
{
d[j]=a[i];
j--;
}
for(int i=0;i<len;i++)
{
a[i]=d[i];
}
}
void add(char a[],char b[])
{
reverse(a);
reverse(b);
int len1=strlen(a);
int len2=strlen(b);
for(int i=0;i<len1;i++)
a1[i]=a[i];
for(int i=0;i<len2;i++)
b1[i]=b[i];
if(len2>len1)//把数的位数用0填充至一样多
{
for(int i=len1;i<len2;i++)
{
a1[i]='0';
}
}
if(len1>=len2)
{
for(int i=len2;i<len1;i++)
{
b1[i]='0';
}
}
//printf("%s %s\n",a1,b1);
int len=max(len1,len2);
for(int i=0;i<len;i++)
{
if(i>0)
{
temp[i]=a1[i]-'0'+b1[i]-'0'+temp1[i-1];
if(temp[i]>=10)
{
temp1[i]=temp[i]/10;//大于十就往前进
temp[i]=(a1[i]-'0'+b1[i]-'0'+temp1[i-1]-10*temp1[i]);//剩下来的个位数
}
}
if(i==0)
{
temp[i]=a1[i]-'0'+b1[i]-'0';
if(temp[i]>=10)
{
temp1[i]=temp[i]/10;
temp[i]=(a1[i]-'0'+b1[i]-'0'-10*temp1[i]);
}
}
c[i]=temp[i]+'0';
//printf("%d %d %c\n",temp[i],temp1[i],c[i]);
}
if(temp1[len-1]>0)
c[len]=temp1[len-1]+'0';
reverse(c);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%s %s",&a,&b);
memset(temp,0,sizeof(temp));
memset(temp1,0,sizeof(temp1));
add(a,b);
reverse(a);
reverse(b);
printf("Case %d:\n%s + %s = %s",i,a,b,c);
int len=strlen(c);
for(int i=0;i<len;i++)
{
c[i]='\0';
}
if(i!=n)
printf("\n\n");
if(i==n)
printf("\n");
}
return 0;
}
return 0;
}
已AC
就是模拟一个竖式运算,思路很清晰,只是代码较长。。。