高精度加法(大数相加)

高精度加法(大数相加)

代码有详细的介绍与注释

#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;
}

完成了,请采纳,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值