43. 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理。

思路:这个题目的思路和我们用笔算做两个数相乘的思路是一样的。从后面往前看:第k位=乘数的第1位乘以被乘数的第k位,+乘数的第2位乘以被乘数的第k-1位,+...+, 一直到乘数的第k位乘以被乘数的第1位,代码实现即可,注意进位。

class Solution {
public:
    string reverse(string s){
        for (int i = 0; i < s.size() / 2; ++i){//我先把字符串转转置,感觉稍微好写点
            swap(s[i], s[s.size() - 1 - i]);
        }
        return s;
    }

    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";//防止出现结果是一堆零的情况
        string s, s1 = reverse(num1), s2 = reverse(num2);
        int c = 0, n1 = s1.size() - 1, n2 = s2.size() - 1;
        for (int j = 0; j < n1 + n2 + 1; ++j){//两个字符串长度分别为n1和n2,则二者乘积不算最后的进位,长度为n1+n2-1;
            int temp = c;
            for (int i = 0; i <= j; ++i){
                int a = (i <= n1 ? int(s1[i] - '0') : 0);
                int b = (j-i <= n2 ? int(s2[j-i] - '0') : 0);
                temp = temp + a * b;
            }
            s = char(temp % 10+'0') + s;
            c = temp / 10;
        }
        if (c!=0) s = char(c+'0') + s;//最后有可能有进位
        return s;
    }
};

猜你喜欢

转载自blog.csdn.net/scarlett_guan/article/details/80151575