AcWing 792. 高精度减法

https://www.acwing.com/problem/content/794/

#include<bits/stdc++.h>
using namespace std;
//判断是否有a>=b  如果是 返回true   反之 返回false
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;  //如果都相等      那么a b相等  直接返回
}
// C=A-B
vector<int> sub(vector<int> &A, vector<int> &B) {  //因为在下面判断过 所以A的位数大于B的位数
    vector<int> C;
    for(int i=0,t=0; i<A.size(); i++) {  //t表示是否有借位
        t=A[i]-t;  //当前位
        if(i<B.size()) t-=B[i];  //判断B有没有这一位。如果有,才会减去。如果没有 就是0 就不用减去
        C.push_back((t+10)%10);
        //如果此时t大于等于0,那么就是t本身。如果小于0,那么就返回t+10   两种情况综合,就是(t+10)%10
        if(t<0) t=1;  //如果t小于零,表示有借位
        else t=0;
    }
    //去前导0    如果只有一位,而且位0,那么就不用去掉
    while(C.size()>1&&C.back()==0)  C.pop_back();
    return C;
}
int main() {
    string a,b;
    //如果有负数   那么就在a和b开头判断是否为-,如果为-,需要打一个标记,存一下每个数是否为负号
    //两个数字相减 A-B   ,如果说,有可能是正负的话 那么一定可以转换为他们的绝对值相减或者绝对值相加的情况 |A|-|B|   |A|+|B|
    //总之 需要分情况讨论
    vector<int>A,B;
    cin>>a>>b;//a=123456
    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');
    if(cmp(A,B)) {     //先判断谁大
        auto C=sub(A,B);  //如果a大  直接算 输出
        for(int i=C.size()-1; i>=0; i--) cout<<C[i];
    } else {   //如果b大
        auto C=sub(B,A);   //颠倒一下
        cout<<"-";  //输出负号
        for(int i=C.size()-1; i>=0; i--) cout<<C[i];
    }
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11757276.html