高精度减法

高精度减法模板

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

输入格式

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

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤105

输入样例:

32
11

输出样例:

21

#include<bits/stdc++.h> //万能头文件
using namespace std;

//适用于两个正数的减法

//判断是否有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;
    //t表示是否有上位
    for (int i = 0, t = 0; i < A.size(); i++) {
        t = A[i] - t;
        if (i < B.size()) {
            t -= B[i];
        }
        //(t + 10) % 10 原因是假如t这个时候是负数,那么需要上一进行变为整数
        C.push_back((t + 10) % 10);
        if (t < 0) {
            t = 1;
        } else {
            t = 0;
        }
    }

    //去除前置0
    while (C.size() > 1 && C.back() == 0) {
        C.pop_back();
    }
    return C;

}





int main() {
    string a, b;
    vector<int> A, B;
    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');
    }

   
    //用来比较A,B的最大值,因为减法使用最大值减去最小值
    if (cmp(A, B)) {
        auto C = sub(A, B);
        for (int i = C.size() - 1; i >= 0; i--) {
            printf("%d", C[i]);
        }
    } else {
        auto C = sub(B, A);
        //因为A < B   所以传入 B - A 是一个正数,故加上负号
        printf("-");

        for (int i = C.size() - 1; i >= 0; i--) {
            printf("%d", C[i]);
        }
    }
    return 0;


}
posted @ 2021-05-11 20:42  JK~  阅读(112)  评论(0编辑  收藏  举报