高精度减法

题目描述

高精度减法。

输入格式

两个整数 a,b(第二个可能比第一个大)。

输出格式

结果(是负数要输出负号)。

样例 #1

样例输入 #1
2
1

样例输出 #1
1

提示

- 20% 数据 a,b 在 long long 范围内;
- 100% 数据 0

代码

#include 
#include 
#include 
using namespace std;

// 比较函数,用于比较两个大整数的大小
bool cmp(vector &A, vector &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];
    }

    // 如果每一位都相同,则返回 true,表示两个整数相等
    return true;
}

// 减法函数,用于计算两个大整数的差
vector sub(vector &A, vector &B)
{
    vector C;  // 存储结果的数组
    int t = 0;      // 用于记录借位

    // 从低位开始逐位计算差值
    for (int i = 0; i < A.size(); i++)
    {
        t = A[i] - t;  // 减去之前的借位
        if (i < B.size())
            t -= B[i];  // 减去另一个整数的当前位

        // 将计算结果(差值+10取模)存入结果数组,以及更新借位
        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()
{
    string a, b;
    cin >> a >> b;
    vector 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 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;
}

你可能感兴趣的:(c++)