大数减法

采用竖式计算,条件是正整数A-B。 A>=B
采取和大数加法相同的方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**************************************************************** 
 * 代码作者: Alex Li
 * 创建时间: 2024-01-31 05:08:16
 * 最后修改: 2025-03-29 18:09:37
 * 文件描述: 大数减法
****************************************************************/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int MAXN = 10005; // 最大数字位数

int A[MAXN], B[MAXN], Result[MAXN]; // 被减数、减数、结果
int Len_A, Len_B, Len_Result; // 各数字的长度

void ReadNumber(int *arr, int &len) {
    string input;
    cin >> input;
    len = input.length();
    for (int i = 0; i < len; i++) {
        arr[i] = input[i] - '0';
    }
    reverse(arr, arr + len); // 低位在前方便计算
}

int main() {
    ReadNumber(A, Len_A);
    ReadNumber(B, Len_B);
    
    Len_Result = max(Len_A, Len_B);

    // 逐位相减并直接处理借位
    for (int i = 0; i < Len_Result; i++) {
        if (A[i] < B[i]) {
            A[i+1]--;    // 直接从上一位借1
            A[i] += 10;  // 当前位加10
        }
        Result[i] = A[i] - B[i];
    }

    // 去除前导零
    while (Len_Result > 1 && Result[Len_Result-1] == 0) {
        Len_Result--;
    }

    // 输出结果(高位在前)
    for (int i = Len_Result-1; i >= 0; i--) {
        cout << Result[i];
    }

    return 0;
}

练习:洛谷P2142
OJ: 4237

Scroll to Top