基本原理
高精度乘高精度,仍然模拟手工竖式乘法的过程。例如计算 123 × 45:
1 2 3
× 4 5
-----------
6 1 5 (123 × 5)
+ 4 9 2 (123 × 4,向左偏移一位)
-----------
5 5 3 5
在计算机中,我们使用数组(小端序)存储每一位,然后:
- 用一个双重循环,将第一个数的每一位乘以第二个数的每一位。
- 乘积的个位放在结果数组的对应位置(下标
i+j),十位及以上作为进位累加到更高位。 - 最后处理所有进位,并去除前导零。
算法步骤
- 初始化结果数组
c,长度至少为len(a)+len(b),所有元素为 0。 - 遍历
i从 0 到len(a)-1:- 初始化进位
carry = 0。 - 遍历
j从 0 到len(b)-1:temp = c[i+j] + a[i] * b[j] + carryc[i+j] = temp % 10carry = temp / 10
- 如果
carry > 0,继续向高位传递:c[i+len(b)] += carry,但这里需要循环处理进位(因为一次进位可能传播多位)。简便做法是在内层循环结束后,用while处理剩余进位。
- 初始化进位
- 去除结果数组末尾(高位)的多余零,但至少保留一位(结果为 0 时保留一个 0)。
代码实现
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// 字符串转小端序 vector
vector<int> strToVec(const string& s) {
vector<int> v;
for (int i = s.size() - 1; i >= 0; --i)
v.push_back(s[i] - '0');
return v;
}
// 去除前导零
void trim(vector<int>& v) {
while (v.size() > 1 && v.back() == 0)
v.pop_back();
}
// 高精度 × 高精度
vector<int> mulBig(const vector<int>& a, const vector<int>& b) {
vector<int> c(a.size() + b.size(), 0); // 结果最多有 len(a)+len(b) 位
for (size_t i = 0; i < a.size(); ++i) {
int carry = 0;
for (size_t j = 0; j < b.size(); ++j) {
int temp = c[i + j] + a[i] * b[j] + carry;
c[i + j] = temp % 10;
carry = temp / 10;
}
// 处理剩余进位
size_t idx = i + b.size();
while (carry) {
int temp = c[idx] + carry;
c[idx] = temp % 10;
carry = temp / 10;
++idx;
}
}
trim(c);
return c;
}
// 输出大数
void printVec(const vector<int>& v) {
for (int i = v.size() - 1; i >= 0; --i)
cout << v[i];
cout << endl;
}
int main() {
string s1, s2;
cin >> s1 >> s2;
vector<int> a = strToVec(s1);
vector<int> b = strToVec(s2);
vector<int> result = mulBig(a, b);
printVec(result);
return 0;
}