算法

高精度加法

导航

高精度加法和高精度减法一样,仍然是模拟传统加法的过程,但是要比高精度减法简单许多,下面是实现的代码

#include<iostream>
#include<vector>

using namespace std;

vector<int> a,b,c;

void add(vector<int>& a, vector<int>& b){
    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= t/10;
    }
    if(t==1){
        c.push_back(1);
    }
}

int main(){
    string x, y;
    cin>> x>> y;

    for(int i= x.size()-1; i>=0; --i){ a.push_back(x[i]-'0'); }
    for(int i= y.size()-1; i>=0; --i){ b.push_back(y[i]-'0'); }

    add(a,b);

    for(int i= c.size()-1; i>=0; --i){
        cout<<c[i];
    }
}

我们仍然选取核心部分讲解(这可比高精度减法好理解多)


核心代码解释

void add(vector<int>& a, vector<int>& b){
    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= t/10;
    }
    if(t==1){
        c.push_back(1);
    }
}

首先,这里的int t的作用其实与高精度减法差不多,也是两个:

  • 上一个数的进位数
  • 当前数位的加法结果

我们从头开始来讲解这段代码

int t= 0

初始化 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];

    //将当前数位的加法记录到结果中,此时 t 的作用变成了当前位数的加法结果
    c.push_back(t%10);

    //这里是进位操作,满十进一,应该好理解的
    t= t/10;
}

这一段是模拟加法操作,请看注释
事实上在每一次循环开始的时候,t 的作用就会重新变成进位数


if(t==1){
    c.push_back(1);
}

最后,这里是收尾操作,防止漏掉最高位的一(不可能出现其他情况的最高位进位,简单想想就知道了),咱们不妨举个例子:
比如9000+9000,倒序存储后在处理最后一位的时候,是9+9,即 t =18,在最后一次循环的时候,t = t/10,从而 t 变成了1,显然,这是一个进位数,所以,这段代码的用处就在这里体现了

评论