c++高精度加法(超详细,有样例和注解,c++)

c++是不自带高精度运算的,这时候我们就要自己模拟高精度运算
下面有详细样例注解

思路是

我们用数组保存这个大数字的每一位,因为涉及到进位问题,所以我们让个位先开始存进数组,即 下标为0的数组存的是个位,下标为1存十位,以此类推

这样当最后一个数位涉及到进位时,我们可以很轻松自然的在数组最后一位加一

请同时看代码同时看下面的思路,不然你可能不知道t是什么,不知道我在描述什么

本题中的t,是当前两位数字的和,即n1[i]+n2[i],它的范围是0<=t<=18,最大取18是因为两个数字的每位最大取9,9+9=18;

将加完的数字t取模之后加进sum数组中,为什么取模,是因为取模后得到的是本位数字,举例8+7=15,本位只需要得到5就可,1是作为进位留在下次更高位中运算

我们以45+86=131举例举例,这样比较直观好理解

第一步

t初始为0 然后t=5+6=11;
接着sum[0]存下1 这个1是由11%10得来的
然后t=t/10 即t=1,这个1是进位

第二步

t初始为1 这个1是上次进位上来的
然后t=t+4+8=13
然后sum[1]=3 这个3是由t%10得来的,即13%10=3
然后t=t/10 即t=1;
此时退出循环

第三步

判断t=1 说明还有进位
那么sum[2]=1;
最终sum数组为{1 3 1}
倒叙输出即为131
这里恰好巧合,个位和百位一样,看似是正序输出,但是最终答案要倒序输出才对,因为个位是保存在sum[0],但是人类数字习惯个位是最后一位
代码中的注释也很详细

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>

using namespace std;

string a,b;//得到要相加的数字字符串

vector <int> n1,n2;//数字n1和数字n2
vector<int>sum;//得到最终的和

//&是引用类型,速度比较快
vector<int> Myadd(vector<int>&n1,vector<int>&n2){

       int t=0;  //作为本次计算完的数字  /10后t代表进位
       
       for(int i=0;i<n1.size()||i<n2.size();i++){
           //这里加if判断是防止两个数组长度不同,短的会有越界问题
           if(i<n1.size())t+=n1[i];
           if(i<n2.size())t+=n2[i];
           sum.push_back(t%10);//取模10是为了只加上个位数,十位数是进位数
           t/=10;  //若有机会 t=1,若没进位,t=0;
           
       }
       if(t)sum.push_back(t);  //若最后一位有进位,要加1
       return sum;
              
}

int main(){
    
    cin>>a>>b;
    //因为是从各位开始保存数字,所以要用倒序
    for(int i=a.size()-1;i>=0;i--)n1.push_back(a[i]-'0');//-'0'是为了让字符变成整形
    for(int i=b.size()-1;i>=0;i--)n2.push_back(b[i]-'0');
    
    Myadd(n1,n2);
    
    for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
    
    
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海风许愿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值