高精度乘法模板
大数乘以普通整数——模拟竖式乘法
高精度
乘法
大数
GESP5
#include <bits/stdc++.h>
using namespace std;
// 高精度 × 低精度
vector<int> mul(vector<int> &A, int b) {
vector<int> C;
int carry = 0;
for (int i = 0; i < A.size() || carry; i++) {
if (i < A.size()) carry += A[i] * b;
C.push_back(carry % 10);
carry /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
// 高精度 × 高精度
vector<int> mul2(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];
int carry = 0;
for (int i = 0; i < C.size(); i++) {
carry += C[i];
C[i] = carry % 10;
carry /= 10;
}
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main() {
string a; int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size()-1; i >= 0; i--) A.push_back(a[i]-'0');
auto C = mul(A, b);
for (int i = C.size()-1; i >= 0; i--) cout << C[i];
cout << endl;
return 0;
}
📖 要点说明
- 高精×低精:逐位乘+进位
- 高精×高精:先逐位乘累加到 C[i+j],再统一进位
- 结果数组最大长度 = lenA + lenB
⚠️ 常见错误
- 高精×高精忘统一进位
- 乘数为0时不去前导零
- C[i+j] 累加时可能很大,注意进位处理