高精度减法

#include<iostream>
#include<vector>
#include<string>

using namespace std;

typedef vector<int> ve;//用ve代替vector<int>,避免麻烦

bool jug(ve& A, ve& B)//判断A,B谁大谁小,A大与等于B返回true,反之返回false
{
    if (A.size() > B.size()) return true;
    else if (A.size() == B.size() && A[0] >= B[0]) return true;
    else return false;
}

ve sub(ve& A, ve& B)
{
    ve C;
    int t = 0;
    for (int i = 0; i < A.size(); i++)
    {
        t = A[i] - t;
        while (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();//判断高位是否有多余的0,有则删除

    return C;
}

int main()
{
    string sum1, sum2;//因为数据太大,所以用string定义来输入
    cin >> sum1 >> sum2;

    ve A, B;

    //循环,将sum1,sum2中的值放入A,B中,倒着放入
    for (int i = sum1.size() - 1; i >= 0; i--) A.push_back(sum1[i] - '0');
    for (int i = sum2.size() - 1; i >= 0; i--) B.push_back(sum2[i] - '0');

    ve res;

    if (jug(A, B))//如果A大,则A在前,B在后,反之B在前,A在后,并输出负号(“-”)
        res = sub(A, B);
    else
    {
        res = sub(B, A);
        cout << "-";
    }

    for (int i = res.size() - 1; i >= 0; i--)//倒着输出,因为储存是高位在后,低位在前
    {
        cout << res[i];
    }
    return 0;
}
posted @ 2021-12-13 23:28  ora12321  阅读(4)  评论(0)    收藏  举报