算法 系列 字符串乘法

基础数据结构...

Posted by lichao modified on June 20, 2020

algorithm

需要注意的是, num1 和 num2 可以⾮常⻓,所以不可以把他们直接转成整型然后运算,唯⼀的思路就是模仿我们⼿算乘法。

algorithm

整个计算过程⼤概是这样,有两个指针 ijnum1num2 上游⾛,计算乘积,同时将乘积叠加到 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 是低位。由于计算顺序就是从右往左、从低到高的,所以每一轮都不需要高位是否要进位,下一轮自然会去处理。