简单大数加法
题目描述输入一个大数(小于100位),输出它们的和。
#include"stdio.h"
add(char n1[100],char n2[100],char n3[101]) // n3为保存n1和n2相加后的值。
{int a1=strlen(n1),a2=strlen(n2),i,j,k,m,t=0;//求出n1和n2的长度
char s;
if(a1<a2) /*此处为将例如:123和456789相加的情况,因为二者长度不一致, 所以将长度短的先相加,然后再独自考虑长度长的的高数位。*/
{for(a1=a1-1,a2=a2-1;a1>=0;a1--,a2--)//a1-1和a2-1,才是数组的最后一个下标值。
{s=((n1[a1]-'0')+(n2[a2]-'0')+'0');//将最后两个相加 保存至s中
if(t==1) //t为判断是否需要进位的作用,如需则将s+1;第一次t为0;
s=s+1;
if(s>'9')//则需要进位;将t改成1
{t=1;n3[a2+1]=s-10;/*printf("%c",s);*/}
else//否则不需要进位,
if(t==1)//判断上一次的加法是否进位了 ,如果是则将t改成0
{n3[a2+1]=s;t=0;}
else
{n3[a2+1]=s;/*printf("%c",n3[a1]);}*/}
}
for(a2;a2>=0;a2--)//此循环为长度长的高位需独自赋值到n3数组中去
{s=n2[a2];
if(t==1)//判断上一次循环中最后一次相加是否需要进位
s=s+1;
if(s>'9')//如果t=1,且10了 则又需进位
{t=1;n3[a2+1]=s-10;/*printf("%c",s);*/}
else
if(t==1)
{n3[a2+1]=s;t=0;}
else
{n3[a2+1]=s;/*printf("%c",n3[a1]);}*/}
}
}
else
if(a1>a2)//此if为n1的长度大于n2的时候
{
for(a2=a2-1,a1=a1-1;a2>=0;a1--,a2--)
{s=((n1[a1]-'0')+(n2[a2]-'0')+'0');
if(t==1)
s=s+1;
if(s>'9')
{t=1;n3[a1+1]=s-10;/*printf("%c",s);*/}
else
if(t==1)
{n3[a1+1]=s;t=0;}
else
{n3[a1+1]=s;/*printf("%c",n3[a1]);}*/}
}
for(a1;a1>=0;a1--)
{s=n1[a1];
if(t==1)
s=s+1;
if(s>'9')
{t=1;n3[a1+1]=s-10;/*printf("%c",s);*/}
else
if(t==1)
{n3[a1+1]=s;t=0;}
else
{n3[a1+1]=s;/*printf("%c",n3[a1]);}*/}
}
}
else//长度相等的时候
{
for(a2=a2-1,a1=a1-1;a2>=0;a1--,a2--)
{s=((n1[a1]-'0')+(n2[a2]-'0')+'0');
if(t==1)
s=s+1;
if(s>'9')
{t=1;n3[a1+1]=s-10;/*printf("%c",s);*/}
else
if(t==1)
{n3[a1+1]=s;t=0;}
else
{n3[a1+1]=s;/*printf("%c",n3[a1]);}*/}
}
}
if(t==1)
n3[0]='1';
}
main()
{int sum,i,j;
static char n1[100],n2[100];static char n3[101];
scanf("%d",&sum);
for(i=0;i<sum;i++)
{for(j=0;j<101;j++)
n3[j]=0;
scanf("%s%s",n1,n2);
add(n1,n2,n3);
if(n3[0]>='0'&&n3[0]<='9')
printf("%s\n",n3);
else
printf("%s\n",n3+1);
}
}