給定兩個非負整數字符串 num1、num2,返回它們乘積的字符串形式。不能使用內置大整數庫或直接轉換為整數。
num1[i] * num2[j] 的結果位於乘積的第 i+j 位(從右向左 0-based)。利用數組 res[i+j] 累加乘積,最後統一處理進位。
digit1 * digit2,累加到 res[i+j]res 處理進位:res[k+1] += res[k] / 10; res[k] %= 10;res,跳過前導零,轉為字符串
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == "0" || num2 == "0") return "0";
int n = num1.size(), m = num2.size();
vector res(n + m, 0); // 最大長度 n+m
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
for (int i = 0; i < n; i++) {
int d1 = num1[i] - '0';
for (int j = 0; j < m; j++) {
int d2 = num2[j] - '0';
res[i + j] += d1 * d2; // 累加到對應位
}
}
// 統一處理進位
for (int k = 0; k < n + m - 1; k++) {
res[k + 1] += res[k] / 10;
res[k] %= 10;
}
// 跳過前導零,構建結果字符串
int idx = n + m - 1;
while (idx > 0 && res[idx] == 0) idx--;
string ans;
for (; idx >= 0; idx--) ans.push_back('0' + res[idx]);
return ans;
}
};
利用快速傅里葉變換將多項式乘法(數字乘法本質)優化至 O((n+m) log(n+m))。步驟:
競賽中常用 NTT(數論變換,模素數避免精度誤差)。LeetCode 此題 O(n²) 通過,FFT 屬進階拓展。
len1 + len2(如 99×99=9801,4 位 = 2+2)