高精度减法
睡不醒的鲤鱼 2021-10-23 常用算法 高精度
一、算法思想
使用数组来存储大整数,为了方便处理进位,可以按照由低位到高位的顺序存储。
定义被减数 A,减数 B,以及低位对当前位的进位 t,那么
- 当 Ai−Bi−t≥0 时,当前位结果为 Ai−Bi−t,同时,t 更新为 0;
- 当 Ai−Bi−t<0 时,当前位结果为 Ai−Bi+10−t,同时,t 更新为 1。
二、算法模板
C++
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;
}
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
}
}
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
题目:高精度减法
给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105 输入样例:
32
11
输出样例:
21
解答代码:
#include <iostream>
#include <vector>
using namespace std;
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;
}
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;
}
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.length() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for (int i = b.length() - 1; i >= 0; i--) B.push_back(b[i] - '0');
if (cmp(A, B)) {
vector<int> C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
} else {
vector<int> C = sub(B, A);
printf("-");
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
}
return 0;
}
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
package main
import (
"bufio"
. "fmt"
"io"
"os"
)
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
}
}
for len(C) > 1 && C[len(C)-1] == 0 {
C = C[:len(C)-1]
}
return
}
func cmp(A, B []int) bool {
if len(A) != len(B) {
return len(A) > len(B)
}
for i := len(A) - 1; i >= 0; i-- {
if A[i] != B[i] {
return A[i] > B[i]
}
}
return true
}
func run(_r io.Reader, out io.Writer) {
in := bufio.NewReader(_r)
var a, b string
Fscan(in, &a, &b)
var A, B []int
for i := len(a) - 1; i >= 0; i-- {
A = append(A, int(a[i]-'0'))
}
for i := len(b) - 1; i >= 0; i-- {
B = append(B, int(b[i]-'0'))
}
var C []int
if cmp(A, B) {
C = sub(A, B)
} else {
C = sub(B, A)
Fprintf(out, "-")
}
for i := len(C) - 1; i >= 0; i-- {
Fprintf(out, "%d", C[i])
}
}
func main() {
run(os.Stdin, os.Stdout)
}
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74