高精度减法

2021-10-23 常用算法 高精度

# 一、算法思想

使用数组来存储大整数,为了方便处理进位,可以按照由低位到高位的顺序存储。

定义被减数 AA,减数 BB,以及低位对当前位的进位 tt,那么

  • AiBit0A_i - B_i - t \ge 0 时,当前位结果为 AiBitA_i - B_i - t,同时,tt 更新为 00
  • AiBit<0A_i - B_i - t \lt 0 时,当前位结果为 AiBi+10tA_i - B_i + 10 - t,同时,tt 更新为 11

# 二、算法模板

C++

// C = A - B, 满足A >= B, A >= 0, B >= 0
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];
        C.push_back((t + 10) % 10);
        t = t < 0 ? 1 : 0;
    }
    
    // 去除前导 0
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    
    return C;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Go

func sub(A, B []int) (C []int) {
    t := 0
    for i := 0; i < len(A); i++ {
        t = A[i] - t
        if i < len(B) {
            t -= B[i]
        }
        C = append(C, (t+10)%10)
        if t < 0 {
            t = 1
        } else {
            t = 0
        }
    }
    // 去除前导 0
    for len(C) > 1 && C[len(C)-1] == 0 {
        C = C[:len(C)-1]
    }
    return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 三、代码实战

# AcWing 0792


题目:高精度减法

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

输入格式

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

输出格式

共一行,包含所求的差。

数据范围

1整数长度1051\le \text{整数长度} \le 10^5

输入样例:

32

11

输出样例:

21

解答代码:

    Last Updated: 2023-01-28 4:31:25