大数减法

采用竖式计算,条件是正整数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
/**************************************************************** 
 * Description: 大数减法
 * Author: Alex Li
 * Date: 2024-01-31 05:08:16
 * LastEditTime: 2024-01-31 05:10:55
****************************************************************/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

const int MAXN = 10005; // 最大数字长度
int A[MAXN], B[MAXN], C[MAXN], Ans[MAXN], Len_A, Len_B, Len_Ans; // 定义数组和长度变量

// 读取大数字并存储为数组,低位在前
void Read(int *arr, int &Len) {
    string cur;
    cin >> cur; // 读取一个大数字字符串
    Len = cur.length(); // 计算数字长度
    for (int i = 0; i < Len; i++) {
        arr[i] = cur[i] - 48; // 将字符转换为数字并存储
    }
    reverse(arr, arr + Len); // 反转数组,以便低位在前
}

int main() {
    Read(A, Len_A); // 读取第一个数
    Read(B, Len_B); // 读取第二个数

    Len_Ans = max(Len_A, Len_B); // 确定结果的最大长度
    for (int i = 0; i <= Len_Ans; i++) {
        Ans[i] = A[i] - B[i] - C[i]; // 执行逐位减法,并考虑借位
        if (Ans[i] < 0) { // 如果当前位结果为负数,需要从高位借位
            C[i + 1]++; // 高位减1
            Ans[i] = Ans[i] + 10; // 当前位加10
        }
    }

    // 去除结果前导0
    while (Len_Ans > 0 && Ans[Len_Ans - 1] == 0) Len_Ans--;

    // 从高位到低位输出结果
    for (int i = Len_Ans - 1; i >= 0; i--) {
        cout << Ans[i];
    }

    return 0;
}

练习:洛谷P2142

Scroll to Top