Python 基础算法——字符串相乘

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

示例 :
输入: num1 = “123”, num2 = “456”
输出: “56088”

# 普通算法	时间复杂度: O(m + n)
def multiply1(num1, num2):
    result = int(num1) * int(num2)
    return str(result)

num1 = "123"
num2 = "456"
print(multiply1(num1, num2))

# 手算乘法	时间复杂度:O(n^2)
def multiply2(num1, num2):
    # 反转两个输入字符串
    num1, num2 = num1[::-1], num2[::-1]
    # 创建结果数组
    result = [0] * (len(num1) + len(num2))
    
    # 逐位相乘
    for i in range(len(num1)):
        for j in range(len(num2)):
            mul = int(num1[i]) * int(num2[j])
            # 加上进位
            mul += result[i + j]
            # 更新当前位和进位
            result[i + j] = mul % 10
            result[i + j + 1] += mul // 10
    
    # 移除结果数组末尾的零
    while len(result) > 1 and result[-1] == 0:
        result.pop()
    # 将结果数组转换为字符串并反转
    return ''.join(str(digit) for digit in result[::-1])

print(multiply2(num1, num2))

# Karatsuba卡拉茨巴算法	时间复杂度:O(n^log3)
def karatsuba(num1, num2):
    # 如果 x 或 y 小于 10,则直接计算它们的乘积并返回结果
    if num1 < 10 and num2 < 10:
        return num1 * num2
    
    # 计算 x 和 y 的位数,并取其中的最大值
    n = max(len(str(num1)), len(str(num2)))
    # 计算分割点
    m = n // 2

     # 将 x 和 y 分别分割为两部分
    a, b = divmod(num1, 10**m)
    c, d = divmod(num2, 10**m)

    # 递归计算ac、bd和(a+b)(c+d)
    ac = karatsuba(a, c)
    bd = karatsuba(b, d)
    ad_bc = karatsuba(a+b, c+d) - ac -bd

    # 返回计算结果
    return ac * 10 ** (2*m) + ad_bc * 10 ** m + bd

print(str(karatsuba(int(num1), int(num2))))

下面是Karatsuba算法的视屏讲解,有需要可以观看。
Karatsuba

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值