题解:AcWing 792 高精度减法

【题目来源】

AcWing:792. 高精度减法 - AcWing题库

【题目描述】

给定两个正整数(不含前导 \(0\)),计算它们的差,计算结果可能为负数。

【输入】

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

【输出】

共一行,包含所求的差。

【输入样例】

32
11

【输出样例】

21

【解题思路】

image

【算法标签】

《AcWing 792 高精度减法》 #高精度#

【代码详解】

#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;
}

// 大数减法函数,计算A - B(要求A >= B)
vector<int> sub(vector<int> &A, vector<int> &B) {
    vector<int> C;  // 存储结果
    int t = 0;      // 借位值
    
    for (int i = 0; i < A.size(); i++) {
        t = A[i] - t;            // 减去借位
        if (i < B.size()) 
            t -= B[i];           // 减去B的当前位
        
        // 处理结果为负数的情况
        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;       // 输入的大数字符串
    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');
    
    // 比较大小并计算差值
    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);
        printf("-");  // 结果为负
        for (int i = C.size() - 1; i >= 0; i--) 
            printf("%d", C[i]);
    }
    
    return 0;
}

【运行结果】

32
11
21
posted @ 2026-02-20 22:20  团爸讲算法  阅读(2)  评论(0)    收藏  举报