9.高精度乘法

 

不用保证A>=B

大数乘小数

这里是把小数b当成一个整体来乘。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 vector<int> mul(vector<int> &A, int b) {
 4     vector<int> C;
 5     int t = 0; //最开始的进位是0 
 6     for (int i = 0; i < A.size() || t; i++) { //要么i没循环完,要么t不为0
 7         if (i < A.size()) {
 8             t += A[i] * b; //相乘再加上上一位的进位
 9         } 
10         C.push_back(t % 10); //当前这一位的结果 
11         t /= 10; //进位
12         //加法模板里,t不是0就是1
13         //乘法模板里,t就有很多情况了 
14     }
15     while (C.size() > 1 && C.back() == 0) {
16         C.pop_back();
17     }
18     return C;
19 }
20 int main() {
21     string a; //a很长 
22     int b; //b很短 
23     cin >> a >> b;
24     vector<int> A, C;
25     for (int i = a.length() - 1; i >= 0; i--) {
26         A.push_back(a[i] - '0');
27     }
28     C = mul(A, b);
29     for (int i = C.size() - 1; i >= 0; i--) {
30         cout << C[i];
31     }
32     return 0;
33 }

大数乘以大数

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 vector<int> mul(vector<int> &A, vector<int> &B) {
 4     vector<int> C(A.size() + B.size());
 5     for (int i = 0; i < A.size(); i++) {
 6         for (int j = 0; j < B.size(); j++) {
 7             C[i + j] += A[i] * B[j];
 8         }
 9     }
10     int t = 0;
11     for (int i = 0; i < C.size(); i++) {
12         t += C[i];
13         C[i] = t % 10;
14         t /= 10;
15     }
16     while (C.size() > 1 && C.back() == 0) {
17         C.pop_back();
18     }
19     return C;
20 }
21 int main() {
22     string a, b;
23     cin >> a >> b;
24     vector<int> A, B, C;
25     for (int i = a.size() - 1; i >= 0; i--) {
26         A.push_back(a[i] - '0');
27     }
28     for (int i = b.size() - 1; i >= 0; i--) {
29         B.push_back(b[i] - '0');
30     }
31     C = mul(A, B);
32     for (int i = C.size() - 1; i >= 0; i--) {
33         cout << C[i];
34     }
35     return 0;
36 }

 2020年9月29日更新:其实如果开的是vector<long long>的话,还可以多压几位,不过一般用不到。

下面的是开vector<int>压4位的做法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int base = 10000;
 4 vector<int> mul(vector<int> &A, vector<int> &B) {
 5     vector<int> C(A.size() + B.size());
 6     for (int i = 0; i < A.size(); i++) {
 7         for (int j = 0; j < B.size(); j++) {
 8             C[i + j] += A[i] * B[j];
 9         }
10     }
11     int t = 0;
12     for (int i = 0; i < C.size(); i++) {
13         t += C[i];
14         C[i] = t % base;
15         t /= base;
16     }
17     while (C.size() > 1 && C.back() == 0) {
18         C.pop_back();
19     }
20     return C;
21 }
22 int main() {
23     string a, b;
24     cin >> a >> b;
25     vector<int> A, B, C;
26     for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
27         s += (a[i] - '0') * t;
28         j++;
29         t *= 10;
30         if (j == 4 || i == 0) {
31             A.push_back(s);
32             s = 0;
33             j = 0;
34             t = 1;
35         }
36     }
37     for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
38         s += (b[i] - '0') * t;
39         j++;
40         t *= 10;
41         if (j == 4 || i == 0) {
42             B.push_back(s);   
43             s = 0;
44             j = 0;
45             t = 1;
46         }
47     }
48     C = mul(A, B);
49     cout << C.back();
50     for (int i = C.size() - 2; i >= 0; i--) {
51         printf("%04d", C[i]);
52     }
53     return 0;
54 }

 然后就是开vector<long long>压9位的做法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int base = 1000000000;
 4 typedef long long ll;
 5 vector<ll> mul(vector<ll> &A, vector<ll> &B) {
 6     vector<ll> C(A.size() + B.size());
 7     for (int i = 0; i < A.size(); i++) {
 8         for (int j = 0; j < B.size(); j++) {
 9             C[i + j] += A[i] * B[j];
10         }
11     }
12     ll t = 0;
13     for (int i = 0; i < C.size(); i++) {
14         t += C[i];
15         C[i] = t % base;
16         t /= base;
17     }
18     while (C.size() > 1 && C.back() == 0) {
19         C.pop_back();
20     }
21     return C;
22 }
23 int main() {
24     string a, b;
25     cin >> a >> b;
26     vector<ll> A, B, C;
27     for (int i = a.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
28         s += (a[i] - '0') * t;
29         j++;
30         t *= 10;
31         if (j == 9 || i == 0) {
32             A.push_back(s); 
33             s = 0;
34             j = 0;
35             t = 1;
36         }
37     }
38     for (int i = b.size() - 1, s = 0, j = 0, t = 1; i >= 0; i--) {
39         s += (b[i] - '0') * t;
40         j++;
41         t *= 10;
42         if (j == 9 || i == 0) {
43             B.push_back(s); 
44             s = 0;
45             j = 0;
46             t = 1;
47         }
48     }
49     C = mul(A, B);
50     cout << C.back();
51     for (int i = C.size() - 2; i >= 0; i--) {
52         cout << setw(9) << setfill('0') << C[i];
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/fx1998/p/12817303.html