LeetCode算法题43:字符串相乘解析

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

示例 1:

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

示例 2:

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

说明:

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

这个题就是乘法的基础计算,将每一位数拆解出来进行相乘,然后错位相加,存储到新的数组中,然后新的数组中就是新的每一位的数,如果大于9就是产生进位,进位加到后面的高位数即可。这个题最好写一个乘法的竖式能好理解一点。程序中是从前往后乘的,所以新数组中存数位从后往前存。这样最终产生的数组就是低位在前,高位在后,最终转化位字符串就是从后往前加到字符串中。
C++源代码:

class Solution {
public:
    string multiply(string num1, string num2) {
        int m = num1.size(), n = num2.size();
        int k = m + n - 2;
        int c = 0;
        vector<int> temp(m+n, 0);
        string res;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                temp[k-i-j] += (num1[i]-'0') * (num2[j]-'0');
        for(int i=0;i<m+n;i++)
        {
            temp[i] += c;
            c = temp[i] / 10;
            temp[i] = temp[i] % 10;
        }
        int f = m+n-1;
        while(f>=0 && temp[f]==0) f--;
        if(f<0) return "0";
        while(f>=0) res.push_back(temp[f--]+'0');
        return res;      
    }
};

python3源代码:

class Solution:
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        m = len(num1)
        n = len(num2)
        k = m+n-2
        c = 0
        temp = [0 for i in range(m+n)]
        res = ""
        for i in range(m):
            for j in range(n):
                temp[k-i-j] += int(num1[i]) * int(num2[j])
        for i in range(m+n):
            temp[i] += c
            c = temp[i] // 10
            temp[i] = temp[i] % 10
        f = m+n-1
        while f>=0 and temp[f]==0: f-=1
        if f < 0: return "0"
        while f >= 0:
            res += str(temp[f])
            f -= 1
        return res

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/85003219