加载中...

【题解】高精度减法


#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>

const int N = 1e5 + 10;

using namespace std;

typedef vector<int> VT;

string a, b;

bool check(VT A, VT B)
{
    // A和B位数不同,且A的位数大于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];
    //此时说明A和B位数相同,且每一位的数字也相同
    return true;
}

// A >= B
VT sub(VT A, VT B)
{
    int t = 0;
    VT C;
    for (int i = 0; i < A.size(); i ++) 
    {
        // t = A[i] - B[i] - t; //t为1说明需要A的上一位需要借位
        t = A[i] - t;
        if (i < B.size()) t = t - B[i];
        // 如果t为负数则需要向上借位,保证t一定大于零
        C.push_back((t + 10) % 10);
        if (t < 0) t = 1;
        else t = 0;
    }
    // 如果C只有一位,表示结果A- B= 0,此时需要保留0
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

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

    VT C;
    // 用大的减小的
    if (check(A, B)) C = sub(A, B);
    else C = sub(B, A), printf("-");
    
    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
    return 0;
}

文章作者: 心意
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 心意 !
评论
  目录