一、题设
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
二、基本思路
当两个数长度为n1和n2时,结果第一位若有另外生成的进位,那么最后结果的位数就是n1+n2;若第一位没有进位时,那么最后结果的位数是n1+n2-1。其他按照乘法的做法单个数字分别相乘相加,有进位用n /10进位,原位保留n % 10即可。
三、代码实现
def multiply(self, num1, num2):
if num1 == "0" or num2 == "0":
return "0"
len1,len2 = len(num1),len(num2)
mult_list = [0] * (len1 + len2 - 1)
# 最后一个是len(mult_list[len1 + len2 - 2 - span])
j = len2 - 1
span = 0
while j >= 0:
s = 0
for i in range(len1-1 , -1 , -1):
mult_list[len1 + len2 - 2 - s - span] += int(num1[i]) * int(num2[j])
s += 1
j -= 1
span += 1
# mult_list = [4,13,28,27,18]
res = ""
f = '0'
for i in range(len1 + len2 - 2 , -1 , -1):
push = mult_list[i] / 10
cur = mult_list[i] % 10
if i == 0:
f = str(push)
mult_list[i] = cur
mult_list[i-1] += push
res += str(cur)
res = res[::-1]
if f != '0':
res = f + res
# res = "8806"
# answer = "56088"
return res
四、效率总结