解题思路
模拟法
将被乘数num1
去乘以从右往左遍历的乘数num2
每一位数字,当然也要记得除了最低位,其余位都要补0,最后将乘积进行累加就是最终结果。
算法过程
- 创建变量
ans
作为最终的结果,carry
作为在做乘法时用于标记进位 - 因为要考虑到乘法运算对十位数以上的运算要保留
0
,所以在运算过程中需要创建变量curr
来保存乘法结果并保留0
- 按照乘法运算规则,从被乘数的末尾开始遍历到头部,对乘数的每一位进行乘法运算,将每次的运算结果放入到
curr
中,注意进位符carry
- 最后将
curr
中保存的数字进行求和,求和方式参照415.字符串相加来解决
细节分析
- 在每次对被乘数的每一位进行乘法运算的时候需要考虑到非最低位数的结果需要在末尾保留
0
,保留多少个0
与该位数的所在位置有关。通过curr = ['0'] * (n - i - 1)
来初始化。
class Solution:
# 将单个乘积结果放入数组curr
def multiply(self, num1: str, num2: str) -> str:
if num1 == '0' or num2 == '0': return '0'
m, n = len(num1), len(num2)
ans = '0'
for i in range(n-1, -1, -1):
carry = 0
y = int(num2[i])
curr = ['0'] * (n - i - 1)
for j in range(m-1, -1, -1):
p = int(num1[j]) * y + carry
curr.append(str(p % 10))
carry = p // 10
if carry > 0:
curr.append(str(carry))
curr = ''.join(curr[::-1])
ans = self.addStrings(ans, curr)
return ans
def addStrings(self, num1, num2):
i, j = len(num1) - 1, len(num2) - 1
carry = 0
ans = []
while i >= 0 or j >= 0 or carry != 0:
x = int(num1[i]) if i >= 0 else 0
y = int(num2[j]) if j >= 0 else 0
result = x + y + carry
ans.append(str(result % 10))
carry = result // 10
i -= 1
j -= 1
return ''.join(ans[::-1])