题目地址:
https://www.luogu.com.cn/problem/P1303
题目描述:
求两数的积。
输入格式:
两行,两个整数。
输出格式:
一行一个整数表示乘积。
数据范围:
每个数字不超过
1
0
2000
10^{2000}
102000,需用高精。
高精度乘法模板题。此题直接用卷积算就行,代码如下:
#include <iostream>
#include <vector>
using namespace std;
vector<int> multiply(vector<int>& A, vector<int>& B) {
vector<int> C(A.size() + B.size(), 0);
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < B.size(); j++)
C[i + j] += A[i] * B[j];
// 处理一下进位
for (int i = 0; i < C.size() - 1; i++) {
C[i + 1] += C[i] / 10;
C[i] %= 10;
}
// 去掉高位的0
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main() {
string a, b;
cin >> a >> b;
vector<int> A, B;
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');
vector<int> C = multiply(A, B);
for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
return 0;
}
时间复杂度 O ( log a log b ) O(\log a\log b) O(logalogb),空间 O ( log a + log b ) O(\log a+\log b) O(loga+logb)。