题目:
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
注意题目中红色部分,表明该题不能用简单的str(int(num1*num2))来解答。
乘法列式计算:
0 1 2 3 4
1 2 3
* 4 5
---------
1 5
1 0
0 5
---------
0 6 1 5
1 2
0 8
0 4
---------
0 5 5 3 5
如上所示,我们只要把每一位数字相乘的结果放在相应的位置再相加即可。
num1的第 i 位与num2的第 j 位相乘。个位数放在答案的 i+j+1 位置上,十位放在 i+j 的位置上。
1 2 3(0 1 2)
* 4 5(0 1)
------------------
3*5=15 个位5放在2+1+1=4位,十位1放在2+1=3位
2*5=10 个位0放在1+1+1=3位,十位1放在1+1=2位
1*5=05 个位5放在0+1+1=2位,十位0放在0+1=1位
3*4=12 个位2放在2+0+1=3位,十位1放在2+0=2位
2*4=08 个位8放在1+0+1=2位,十位0放在1+0=1位
1*4=04 个位4放在0+0+1=1位,十位0放在0+0=0位
最后答案:
0 1 2 3 4
0 4+0+0 1+5+1+8 1+0+2 5
0 4 15 3 5
判断答案是否有进位
15有进位,留下5,进1位
0 4+1 5 3 5
去除首位的0
5 5 3 5
代码:
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
if num1=='0'or num2=='0':
return '0'
lng1,lng2=len(num1),len(num2)
ans=[0 for _ in range(lng1 + lng2)]
for i in range(lng1-1,-1,-1):
for j in range(lng2-1,-1,-1):
t1,t2=ord(num1[i])- ord('0'),ord(num2[j])- ord('0')
tmp=t1*t2
#tmp+=ans[i+j+1]
ans[i+j+1]+=tmp%10
ans[i+j]+=tmp//10
for i in range(lng1+lng2-1,0,-1):
tmp=ans[i]//10
ans[i]=ans[i]%10
ans[i-1]+=tmp
res=''.join( str(n) for n in ans).lstrip('0')
return res