- 题目如下
- 普通方法:基于竖式的计算(图片来自breezean答案)
- 优化方法:对竖式计算进行优化,如图(图片来源同上)
- 该方法说的是,num1和num2从左到右index,即左边第一位的index为0,依次类推;
- num1、num2设分别有N、M位,则乘积结果RES的位数最多是N+M位;
- 如下图所示,如果num1的第i位(index i)乘以num2的第j位(index j),会得到一个至多两位的数,即为ab,a可能为0;而a在RES中的index是第i+j位,b在RES中的index是第i+j+1位;
- 下图举例,2*4=08,0在RES的第 i+j=1+0=1 位,8在RES的第 i+j+1=0+1+1=2 位;
- 由此,只要对num1、num2遍历相乘,把得到的两位数结果分别累加到RES相应的位上,最后整理一次进位,即可得到乘积RES,再以字符串输出即可;
- 代码如下:
class Solution:
def multiply(self, num1: str, num2: str) -> str:
"""
方法:
竖式计算的快捷方法
num1的N位数*num2的M位数 结果res最多有N+M位;
从左往右做index(首位0),num1的第i位和num2的第j位相乘,
得到的两位数记为0y或者xy,
该两位数的第一位在res中的index为i+j,
第二位的index为i+j+1
"""
if not num1 or not num2 or len(num1)==0 or len(num2)==0:
return None
if num1 == "0" or num2 == "0": # 容易漏掉
return "0"
len_num1 = len(num1)
len_num2 = len(num2)
res = [0] * (len_num1 + len_num2) # N+M位,用于累加
for i in range(len_num1):
int1 = ord(num1[i]) - ord("0") # 字符串转成整数
for j in range(len_num2):
int2 = ord(num2[j]) - ord("0")
res_tmp = int1 * int2
res[i+j] += res_tmp // 10 # 十位
res[i+j+1] += res_tmp % 10 # 个位
for ix in range(len(res)-1, -1, -1): # 整理进位
if res[ix] > 9:
res[ix-1] += res[ix] // 10 # 注意要先计算进位
res[ix] = res[ix] % 10
res = [str(r) for r in res] # 转成字符串
return "".join(res) if res[0] != "0" else "".join(res[1:])
- 总结:
- 主要是竖式计算优化技巧