今天我们来讲一下高精度减法

首先什么是高精度减法呢?☹️☹️☹️

我们来看一下百度是怎么介绍高精度减法的,没想到百度居然偷懒,那我也顺带放上高精度加法的介绍吧。
也可以看看我之前对于高精度加法的介绍

高精度减法和加法区别不大,存储的时候我们也是倒序存入数组中,因为我们都知道,减法的过程中是会向前借位的,同样的,如果最高位是1,借位后为0,那么我们就不能够直接输出数组元素,必须先去掉前导零;还有就是因为减法是会产生负数,所以在计算之前我们应该先比较两个数的大小,通过数组长度以及从最高位开始对应位的大小;还有就是借位了,有一个很巧妙的计算借位相减后的数字, (t + 10) % 10 怎么理解呢, t存的是对应位相减的结果无论结果是正数还是负数,计算后都会得到正确的结果,然后根据t是否大于零来判断是否借位了。

负数记得输出负号哦~~~

接下来我们来看看模板👇👇👇


bool cmp(vector<int> &A , vector<int> &B)
{
    if(A.size() != B.size()) return A.size() > B.size();// 如果位数不相等,返回A > B 的结果

    // 遍历A与B的每一位,此时位数相同,用A或者B的size都行,只要有一位不同,就返回A[i] > B[i] 的结果
    for(int i = A.size() -1; i >= 0; i --)
        if(A[i] != B[i]) return A[i] > B[i];
    
    return true;
}

vector<int> sub(vector<int> &A , vector<int> &B)
{
    vector<int> C; // 存放结果

    int t = 0; // 记录是否借位

    for(int i = 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;
}

cmp函数是比较减数与被减数的大小,sub函数就是减法的具体内容了

模板内容就这么多,很好理解的,输出的时候记得倒序输出

那么我们来一道模板题练练手👏👏👏

AcWing 792. 高精度减法

题目描述

给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

11051≤整数长度≤105

输入样例:

32
11

输出样例:

21

C++代码

#include <iostream>
#include <vector>

using namespace std;

vector<int> A , B;
string a , b;

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

    return true;
}

vector<int> sub(vector<int> &A , vector<int> &B)
{
    vector<int> C;

    int t = 0;
    for(int i = 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;
}

int main()
{
    cin >> 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');

    vector<int> C;
    if(cmp(A , B))  C = sub(A , B);
    else C = sub(B , A) , cout << '-' ;

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

    return 0;
}

引用

数组实现的看一看下面引用的题解;也有Java的实现方法,虽然Java有大数类;对压位感兴趣的小伙伴也可以看看🤺🤺🤺

师大专升本16级学长 AcWing 792. 高精度减法(C语言新手版)

jasonlin AcWing 792. 高精度减法

小呆呆 AcWing 792. 高精度减法

Accepting AcWing 792. 高精度减法(压位)