1. 高精度加法

高精度加法就是把我们平常在草稿纸上的计算过程模拟在计算机中,只不过细节稍微有些不同。在数据存放时我们通常高位在左边低位在右边,而在高精度算法中是相反的,我们的运算过程是这样的

我们的代码如下

 

    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);

 

  2.高精度减法

其实我们的高精度减法和加法差不多不过我们得多一步比较的步骤,比较的代码如下:

bool cmp(vector<int> a, vector<int> b)
{
    if(a.size() != b.size()) return a.size() > b.size();
    for(int i = a.size() - 1; i >= 0; i --)
        if(a[i] != b[i])
            return a[i] > b[i];
}

我们需先进行比较才能在被除数小于除数的时候输出负号

设 t = a[i] - b[i],由于a[i]和b[i]都是小于10的为了防止把负数插入数组中我们可以进行以下操作,当t大于0时(t + 10) % 10 == t小于0时t =  - t;

c.push_back((t + 10) % 10)

下面进行相减的流程和高精度加法差不多

vector<int> cha(vector<int> a, vector<int> b)
{
    vector<int> c;
    
    for(int i = 0, t = 0; i < a.size(); i ++)
    {
        t = a[i] - t;
        if(i < b.size()) t -= b[i];
        c.push_back((t + 10) % 10);
        if(t < 0) t = 1;//借位
        else t = 0;
    }
    
     while(c.size() > 1 && c.back() == 0) c.pop_back();//去除前导0
     
     return c;
}

 

  3.高精度乘法

我们通常把一个高精度和一个低精度数相乘,但是乘法和加减稍微有一些区别,在这个过程中我们会把a的每一位数都与b相乘代码如下

    vector<int> C;

    int t = 0;
    for (int i = 0; i < a.size() || t; i ++ )
    {
        if (i < a.size()) t += a[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();//去除前导0

    return C;

t的个位数我们先插入数组,而t的个位以上的数位则是作为进位来进行下一次运算

 

  4.高精度除法

而除法又与乘法有些不同,我们之前都是从低位到高位进行运算,而除法我们是从高位到低位进行运算,在除的时候是把余数与除数进行运算,因此我们还需要有一个变量来来存储余数,步骤如下图

代码如下图所示:

vector <int> mul(vector <int> & A, int b) {
    vector <int> C;

    int t = 0;
    for (int i = 0; i < A.size(); i ++) {
        t += A[i] * b;       // t + A[i] * b = 7218
        C.push_back(t % 10); // 只取个位 8
        t /= 10;             // 721 看作 进位
    }

    while (t) {            // 处理最后剩余的 t
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}