不用保证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 }