C++算法—高精度加法的原理与代码实践


高精度加法适用于大整数,即科学计数法指数位 len < 10^6,这个长度,在c++中不可以再去用long类型,int类型去存储以及运算。为了满足实际需要,使用数组来存储大整数,并模拟加法的行为创建一个新的功能,这就是高精度加法。

如何存储?

这样的大整数我们用string类型来接受输入,接着把这个大整数存进我们创建的数组里,数组每一个元素对应大整数的每一位,需要注意的是,这里我们是把大整数个位存在数组的第一个元素,大整数的最高位存在数组的末尾。这样做的好处是,涉及进位的时候,我们在末尾新增一个元素,比在起始处新增一个元素的难度简单得多。

```
string A, B;
cin >> A >> B;

vector<int> a, b;
for(int i = A.size() - 1; i >= 0; i --)a.push_back(A[i] - '0');
for(int i = B.size() - 1; i >= 0; i --)b.push_back(B[i] - '0')
```

如何模拟加法行为?

我的理解是可以看作我们小学时做过的竖式题,每个位相加,过十进位。对应到数组操作,数组的对应元素相加,记录进位,并把应该留下的数字插进新的存储结果的数组中。下一对元素相加,再加上进位,重复以上的操作。循环结束后,检查t是否还有一位未进,如果有,再插入1

vector<int> add(vector<int> a, vector<int> b)
{
    vector<int> c;
    int t = 0;
            
    for(int i = 0; i < a.size() || i < b.size(); i ++)
    {
        if(i < a.size())t += a[i];
        if(i < b.size())t += b[i];
        c.push_back(t % 10);
        t /= 10;
    }
    
    if(t)c.push_back(1);
    return c;
}

完整代码

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;


vector<int> add(vector<int> a, vector<int> b)
{
    vector<int> c;
    int t = 0;
            
    for(int i = 0; i < a.size() || i < b.size(); i ++)
    {
        if(i < a.size())t += a[i];
        if(i < b.size())t += b[i];
        c.push_back(t % 10);
        t /= 10;
    }
    
    if(t)c.push_back(1);
    return c;
}

int main()
{
    string A, B;
    cin >> A >> B;
    
    vector<int> a, b;
    for(int i = A.size() - 1; i >= 0; i --)a.push_back(A[i] - '0');
    for(int i = B.size() - 1; i >= 0; i --)b.push_back(B[i] - '0');
    
    auto c = add(a, b);
    for(int i = c.size()- 1; i >= 0; i --)cout << c[i];
    
    return 0;
}
  1. t主要用来进位,但履行的功能更加丰富,首先用它来存储位的加和,加和结果个位是结果的位,十位是进到下一位的位的记录。所以取它的模之后去掉它的个位留到下一次循环。
  2. 循环条件是i小于拥有位数最多的大整数的位数,进入循环体要再判断一次参与加和的大整数这个位置还有没有数字。

本文做学习笔记用,课程是acwing的算法基础课,笔者大一计算机专业,敬请指正和交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值