高精度加法(大数相加)
代码有详细的介绍与注释
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
char a[100001],b[100001];//这是要输入的两个大数,把他们存放到字符串里面;
int c[100001],i,j;//c是最后的结果;
int cnt=0;//进位标志,若a+b>0,cnt=0,进一;
int l1,l2;//l1是a的长度,l2是b的长度;
int t=0;//判断是否是0+0的标志;
int z=0;//z是a+b的和;
int d=0;//d是数组c第几位,从0开始;
cin>>a>>b;//输入a和b;
l1=strlen(a);//计算a的长度;
l2=strlen(b);//计算b的长度;
for(i=l1-1,j=l2-1;;i--,j--)//因为数组从0开始,所以a,b要减一位,中间不给判断是因为要i,j同时控制循环;
{
if(i<0&&j<0)//控制循环终止,当i,j同时小于0结束;
break;
if(i>=0)
z=z+a[i]-'0';//先加上a,因为a是以字符的形式输入的,所以减去'0';
if(j>=0)
z=z+b[j]-'0';//再加上b,同理,因为b是以字符的形式输入的,所以也减去'0';
z=z+cnt;//因为z要加上前一位的进1的数;
if(z>=10)//如果z大于等于10,说明本次a+b要进一;
{
c[d]=z-10;//这一位的数字为加的和z减去10,也就是双位数的个位;
cnt=1;//因为进一,所以进位标志为1;
}
if(z<10)//如果z小于10,说明本次a+b不用进一;
{
c[d]=z;//这一位的数字也就是相加后的数字z;
cnt=0;//因为不需要进一,所以进位标志为0;
}
d++;//该位数已经确定,d要加一;
z=0;//a+b的和重置为0;
}
if(cnt==1)//循环结束后,如果进位标志是1,则说明还有一位是1;
c[d]=1;//所以让这一位的数字为1,且为最大的位数;
if(cnt==0)//循环结束后,如果进位标志是0,则说明循环结束便是最大的位数;
c[d]=0;//让这一位的数字为0;
for(i=d;i>=0;i--)//这个循环是用来删去前面多余的0;
if(c[i]!=0)//直到这一位不是0的时候,循环终止break;
break;
for(i=i;i>=0;i--)//从终止的那一位开始输出,直到个位;
{
printf("%d",c[i]);
t=1;//之所以让t=1,是因为防止0+0,若是0+0,则不会进行这个循环;
}
if(t==0)//如果是0+0,则输出0;
printf("0");
return 0;
}
完成了,请采纳,谢谢。