python两个字符串相乘_43. 字符串相乘(Python)

更多精彩内容,请关注【力扣中等题】。

题目

难度:★★★☆☆

类型:数学

方法:暴力求解

解答

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

示例 1

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2

输入: num1 = "123", num2 = "456"

输出: "56088"

说明

num1 和 num2 的长度小于110。

num1 和 num2 只包含数字 0-9。

num1 和 num2 均不以零开头,除非是数字 0 本身。

不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解答

虽然实现“str(int(num1)*int(num2))”很方便快捷,但是还是有必要知道怎么做的,这里没有涉及任何int类型计算,还原小学课堂的原始体验。

小学一年级和三年级分别要背两个字典:

加法字典:{(加数1,加数2,上一步的进位):(两数之和,进位)}

乘法字典:{(因数1,因数2):乘积}

按照要求分别实现下面几个功能函数:

两数相加;

多个数字相加;

多位数乘一位数;

多位数乘多位数。

class Solution:

def multiply(self, num1: str, num2: str) -> str:

add_result = {(str(i), str(j), str(c)): (str((i + j + c) % 10), str((i + j + c) // 10)) for i in range(10) for j in range(10) for c in range(2)}

mul_result = {(str(i), str(j)): str(i*j).zfill(2) for i in range(10) for j in range(10)}

def two_sum(num1: str, num2: str) -> str:

max_len = max(len(num1), len(num2))

num1, num2 = num1.zfill(max_len), num2.zfill(max_len)

res, carry = '', '0'

for str1, str2 in reversed(list(zip(num1, num2))):

sum_tmp, carry = add_result[(str1, str2, carry)]

res = sum_tmp + res

res = carry + res if carry == '1' else res

return res

def n_sum(nums):

res = '0'

for num in nums:

res = two_sum(res, num)

return res

def mul_num_bit(digits, digit):

"""

Multiply multiple digits with one digit.

:return:

"""

res, carry = '', '0'

for bit in reversed(digits):

mul_res = mul_result[(bit, digit)]

mul_res = two_sum(mul_res, carry)

carry, mul_tmp = mul_res[0], mul_res[1]

res = mul_tmp + res

res = carry + res if carry != '0' else res

return res

def two_multiply(num1: str, num2: str):

res = []

num2 = num2[::-1]

for i in range(len(num2)):

cur_mul = mul_num_bit(num1, num2[i]) + '0' * i

res.append(cur_mul)

res = n_sum(res)

return '0' if set(res) == {'0'} else res

return two_multiply(num1, num2)

如有疑问或建议,欢迎评论区留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值