【问题标题】:Multiply strings-Leetcode using Karatsuba algorithm with Python [closed]使用 Karatsuba 算法和 Python 将字符串相乘 - Leetcode [关闭]
【发布时间】:2020-06-23 04:56:30
【问题描述】:

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

示例 1:

Input: num1 = "2", num2 = "3"
Output: "6"

示例 2:

Input: num1 = "123", num2 = "456"
Output: "56088"

注意:

num1 和 num2 的长度均

有很多不同的方法可以解决这个问题。其中之一是使用Karatsuba algorithm

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        if len(num1)==1 or len(num2)==1:
            return str(int(num1)*int(num2))
        m=max(len(num1),len(num2))
        m2=m//2   

        num1=int(num1)
        num2=int(num2)
        a=num1//10**m2
        b=num1%10**m2
        c=num2//10**m2
        d=num2%10**m2
        
        z0=self.multiply(str(b),str(c))
        z1=self.multiply(str(a+b),str(c+d))-a*c-b*d
        z2=self.multiply(str(a), str(c))
        
        return (z2 * 10**(2*m2)) + ((z1 - z2 - z0) * 10**(m2)) + (z0)

应用的伪代码是正确的,但是由于字符串和整数之间的重复转换,代码会受到影响。我可以做些什么来改进这一点?这是解决这个问题的正确方法吗?提前致谢

这是帮助我的参考链接-https://pythonandr.com/2015/10/13/karatsuba-multiplication-algorithm-python-code/

【问题讨论】:

  • 你要做的就是实现小学乘法。此外,“您不得 [...] 将输入直接转换为整数” 表示您不允许这样做:num1 = int(num1)
  • @ user3386109 但它给了我错误-字符串除法无效。我该怎么办?
  • 您可以将字符串转换为数字列表,例如num1 = "123"digits = [int(n) for n in num1]print digits
  • 我不在 python 中编码,但从我的角度来看,代码是错误的,因为它将你的字符串 s 转换为数字。那是在内部使用 bigints 或溢出使用的数据类型,具体取决于使用的 lenvironment。第一个与分配相矛盾,后者破坏了结果。您需要改为对字符串进行所有数学运算。所以你需要在字符串上实现基本的数学运算,比如+,-,*=10,/=10,...。然后以此为基础。但是,还有其他替代 karatsuba 的方法,请参阅Fast bignum square computation

标签: python algorithm computer-science karatsuba


【解决方案1】:
class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        def mul(num1, num2):
            if len(num1) == 1 or len(num2) == 1:
                return int(num1) * int(num2)
            m = min(len(num1), len(num2)) // 2
            a, b = num1[:len(num1) - m], num1[len(num1) - m:]
            c, d = num2[:len(num2) - m], num2[len(num2) - m:]
            z0 = mul(b, d)
            z2 = mul(a, c)
            z1 = mul(str(int(a) + int(b)), str(int(c) + int(d))) - z2 - z0
            return (10 ** (2 * m)) * z2 + (10 ** m) * z1 + z0

        return str(mul(num1, num2))

最初我是问同样问题的人,后来我想通了,我正在发布解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2020-08-17
    相关资源
    最近更新 更多