在算法竞赛中,高精度(大整数)乘法最容易出错的地方是进位处理 和前导零去除。
这里为你提供一个最适合在比赛中快速默写、不易出错的 C++ 模板。它的核心技巧是模拟竖式乘法并利用下标规律 :num1 的第 i 位和 num2 的第 j 位相乘,其乘积一定会累加到结果数组的第 i + j + 1 位,而进位会落在 i + j 位。
cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string multiply(string num1, string num2) {
// 1. 特判 0 的情况,防止最后输出空字符串或多个 0
if (num1 == "0" || num2 == "0") return "0";
int n = num1.size(), m = num2.size();
// 2. 两个数相乘,最大长度不会超过它们的长度之和
vector<int> res(n + m, 0);
// 3. 从右向左遍历(从低位到高位)
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
// 当前乘积 + 原有进位
int sum = (num1[i] - '0') * (num2[j] - '0') + res[i + j + 1];
// 更新当前位
res[i + j + 1] = sum % 10;
// 更新进位(注意这里是 +=,因为进位可能累积)
res[i + j] += sum / 10;
}
}
// 4. 转回字符串并去除前导零
string ans = "";
for (int p : res) {
// 只要 ans 不是空的,或者当前数字不是 0,就加进去
if (!(ans.empty() && p == 0)) {
ans.push_back(p + '0');
}
}
return ans;
}