您的位置:首页 > 其它

LeetCode Multiply Strings

2016-01-06 10:04 411 查看

LeetCode解题之Multiply Strings

原题

将两个用字符串表示的数进行乘法操作并返回字符串结果。

注意点:

给的数是非负整数

数字可以无穷大

例子:

输入: num1 = “123”, num2 = “20”

输出: “2460”

解题思路

根据笔算乘法的公式来看,乘法操作分解开来其实就是先进行每个位的乘法操作,然后将所有结果进行加法操作。首先明确一个m位的数乘以一个n位的数做多为m+n位(都是9的时候试一下)。其次后面的0相等的数在相加时是末尾对齐的。如123×456,我们可以看到1×6、2×5和3×4在进行加法的时候是末尾对齐的,我们可以在进行第一轮乘法的时候将这些数先加起来,而后面的零通过在列表中的位置来表示。再用一个循环进行进位加法,最后把开头多余的0去掉。具体步骤看下面的例子:

[code]123*456

100        400
 20         50
  3          6

[3*6, 2*6+3*5, 1*6+2*5+3*4, 2*4+1*5, 1*4, 0]

[18, 27, 28, 13, 4, 0]

[8, 27+1, 28, 13, 4, 0]

[8, 8, 28+2, 13, 4, 0]

[8, 8, 0, 13+3, 4, 0]

[8, 8, 0, 6, 5, 0]

"880650"-->"056088"

"56088"


AC源码

[code]class Solution(object):
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        num1 = num1[::-1]
        num2 = num2[::-1]
        length1 = len(num1)
        length2 = len(num2)
        temp = [0 for __ in range(length1 + length2)]
        # Do multiply
        for i in range(length1):
            for j in range(length2):
                temp[i + j] += int(num1[i]) * int(num2[j])
        carry = 0
        digits = []
        # Do plus
        for num in temp:
            s = carry + num
            carry = s // 10
            digits.append(str(s % 10))
        result = "".join(digits)[::-1]
        # Remove the surplus zero
        sub_index = 0
        for i in range(length1 + length2 - 1):
            if result[i] == "0":
                sub_index += 1
            else:
                break
        result = result[sub_index:]
        return result

if __name__ == "__main__":
    assert Solution().multiply("120", "20000") == 2400000
    assert Solution().multiply("0", "3421") == 0


欢迎查看我的Github来获得相关源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: