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