高精度

模拟人工运算过程,逆序存储,找出递推式

高精度加法

// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);
    return C;
}

791. 高精度加法 

高精度减法 

// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(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();
    return C;
}

792. 高精度减法 

高精度乘法低精度

// C = A * b, A >= 0, b > 0
vector<int> mul(vector<int> &A, int 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();

    return C;
}

793. 高精度乘法 

高精度除以低精度 

// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

794. 高精度除法 

前缀和

定义:原数组a[N],S[i]=a[1]+a[2]+…+a[i],S[0]=0(下标从1开始,边界处理方便)

   原数组a[N][M],S[i][j]=a[i][j]+S[i-1][j]+S[i][j-1]-S[i-1][j-1]

作用:快速求出区间的和

795. 前缀和

796. 子矩阵的和

差分法

定义:原数组a[N],b[i]=a[i]-a[i-1],a称为b的前缀和(a[i]=b[1]+b[2]+…b[i]),b称为a的差分,也相当于在(i,i)区间上加上了a[i]

   原数组a[N][M],b[i][j]则是在(i,j,i,j)区间上加上了a[i][j]

作用:给原数组某一个区间加上固定的值(O(n)->O(1)),

   例如:给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c

   给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
   S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

797. 差分

798. 差分矩阵