8.高精度减法

假定A和B都是正数,假定A这个数>=B这个数。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 bool cmp(vector<int> &A, vector<int> &B) { //判断是否A>=B,如果A>=B返回true,否则返回false 
 4     if (A.size() != B.size()) {
 5         return A.size() > B.size();
 6     }
 7     for (int i = A.size() - 1; i >= 0; i--) { //从高位开始比较 
 8         if (A[i] != B[i]) {
 9             return A[i] > B[i];
10         }
11     }
12     return true; //A=B也成立 
13 }
14 vector<int> sub(vector<int> &A, vector<int> &B) {
15     vector<int> C;
16     int t = 0;
17     //已经保证了A>=B 
18     for (int i = 0; i < A.size(); i++) {
19         //还是用t来表示当前这一位 
20         t = A[i] - t;
21         if (i < B.size()) {
22             t -= B[i];
23         }
24         //若t>=0,就是t
25         //若t<0,就是t+10 
26         //t一定是个位数.-9 ~ 9
27         C.push_back((t + 10) % 10);
28         //t不是0就是1 
29         //t=0表示没有借位
30         //t=1表示借位了 
31         if (t < 0) {
32             t = 1;
33         } else {
34             t = 0;
35         }
36     }
37     //去掉前导0 
38     while (C.size() > 1 && C.back() == 0) {
39         C.pop_back();
40     }
41     return C;
42 }
43 int main() {
44     string a, b;
45     cin >> a >> b;
46     vector<int> A, B;
47     for (int i = a.length() - 1; i >= 0; i--) {
48         A.push_back(a[i] - '0');
49     }
50     for (int i = b.length() - 1; i >= 0; i--) {
51         B.push_back(b[i] - '0');
52     }
53     vector<int> C;
54     if (cmp(A, B)) { //如果A>=B的话,直接减。5-3 
55         C = sub(A, B);
56     } else { //否则:-(3 - 5) 
57         cout << "-";
58         C = sub(B, A);
59     }
60     for (int i = C.size() - 1; i >= 0; i--) {
61         cout << C[i];
62     }
63     return 0;
64 }

 2020年9月29日更新:高精度压8位的做法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int base = 100000000;
 4 bool cmp(vector<int> &A, vector<int> &B) {
 5     if (A.size() != B.size()) {
 6         return A.size() > B.size();
 7     }
 8     for (int i = A.size() - 1; i >= 0; i--) {
 9         if (A[i] != B[i]) {
10             return A[i] > B[i];
11         }
12     }
13     return true;
14 }
15 vector<int> sub(vector<int> &A, vector<int> &B) {
16     vector<int> C;
17     int t = 0;
18     for (int i = 0; i < A.size(); i++) {
19         t = A[i] - t;
20         if (i < B.size()) {
21             t -= B[i];
22         }
23         C.push_back((t + base) % base);
24         if (t < 0) {
25             t = 1;
26         } else {
27             t = 0;
28         }
29     }
30     while (C.size() > 1 && C.back() == 0) {
31         C.pop_back();
32     }
33     return C;
34 }
35 int main() {
36     string a, b;
37     cin >> a >> b;
38     vector<int> A, B, C;
39     for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
40         s += (a[i] - '0') * t;
41         j++;
42         t *= 10;
43         if (j == 8 || i == 0) {
44             A.push_back(s);
45             s = 0;
46             j = 0;
47             t = 1;
48         }
49     }
50     for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
51         s += (b[i] - '0') * t;
52         j++;
53         t *= 10;
54         if (j == 8 || i == 0) {
55             B.push_back(s);
56             s = 0;
57             j = 0;
58             t = 1;
59         }
60     }
61     if (cmp(A, B)) {
62         C = sub(A, B);
63     } else {
64         cout << "-";
65         C = sub(B, A);
66     }
67     cout << C.back();
68     for (int i = C.size() - 2; i >= 0; i--) {
69         printf("%08d", C[i]);
70     }
71     return 0;
72 }
原文地址:https://www.cnblogs.com/fx1998/p/12815527.html