需要注意的是, num1 和 num2 可以⾮常⻓,所以不可以把他们直接转成整型然后运算,唯⼀的思路就是模仿我们⼿算乘法。
整个计算过程⼤概是这样,有两个指针 i
,j
在 num1
和 num2
上游⾛,计算乘积,同时将乘积叠加到 res 的正确位置。num1[i]
和 num2[j]
的乘积对应的就是 res[i+j]
和 res[i+j+1]
这两个位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
string multiply(string num1, string num2) {
int m = num1.size(), n = num2.size();
// 结果最多为 m + n 位数
vector<int> res(m + n, 0);
// 从个位数开始逐位相乘
for (int i = m - 1; i >= 0; i--)
for (int j = n - 1; j >= 0; j--) {
int mul = (num1[i]-'0') * (num2[j]-'0');
// 乘积在 res 对应的索引位置
int p1 = i + j, p2 = i + j + 1;
// 叠加到 res 上
int sum = mul + res[p2];
res[p2] = sum % 10;
res[p1] += sum / 10;
}
// 结果前缀可能存的 0(未使⽤的位)
int i = 0;
while (i < res.size() && res[i] == 0)
i++;
// 将计算结果转化成字符串
string str;
for (; i < res.size(); i++)
str.push_back('0' + res[i]);
return str.size() == 0 ? "0" : str;
}
res[p1] += sum / 10;
请问这个res[p1]
上的数可以大于 10 吗? 可以大于 10。p1 是最终结果的高位,p1 是低位。由于计算顺序就是从右往左、从低到高的,所以每一轮都不需要高位是否要进位,下一轮自然会去处理。