Day22:给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
eg : input : num1 = "123",num2 = "456"
output : 56988
#作为Day20的升级版,区别在于本题需要先相乘后相加
#不能直接用str(int(num1) + int(num2))这种形式来计算
#此题可以分为两步:(1).让num1
依次乘上 num2
的每一位的和
(2).把第一步里得到的所有和累加在一起,就可以得到 num1 * num2
的结果
第一步:首先得到主函数:
1 class Solution(object): 2 def multiply(self,num1,num2): 3 if num1 == "0" or num2 == "0": 4 return "0" 5 l1,l2 = len(num1),len(num2) 6 # 保障num1始终比num2长, 个人习惯 7 if l1 < l2: 8 num1,num2 = num2,num1 9 l1,l2 = l2,l1 10 #倒过来方便进位 11 num2 = num2[::-1] 12 res = "0" 13 for i,digit in enumerate(num2): 14 tmp = self.StringMultiplyDigit(num1,int(digit)) + "0" * i #计算nums1与nums2的当前位的乘积 15 res = self.StringPlusString(res,tmp) #计算每位乘积之和 16 17 return res
第二步:两个数字相乘(其中param2是个位数字)
1 def StringMultiplyDigit(self, param1, param2): 2 ''' 3 进行乘积运算 4 :param param1:str 5 :param param2:int 6 :return:str 7 ''' 8 res = "" 9 i = len(param1) - 1 10 carry = 0 #进位 11 while i >= 0: 12 n1 = int(param1[i]) if i >= 0 else 0 13 tmp = n1 * param2 + carry # tmp : int 14 carry = tmp // 10 # carry : int 15 res = str(tmp % 10) + res # res : str 16 i -= 1 17 return str(carry) + res if carry else res
第三步:两个数字相加(套用Day20里面的加法代码)
1 def StringPlusString(self, s1,s2): 2 ''' 3 进行加法运算 4 :param s1:str 5 :param s2:str 6 :return:str 7 ''' 8 res = "" # 用来存储每位的数字 9 i = len(s1) - 1 # num1的尾部 10 j = len(s2) - 1 # num2的尾部 11 carry = 0 # 看是否产生进位,初始不进位,所以为0 12 while i >= 0 or j >= 0: 13 n1 = int(s1[i]) if i >= 0 else 0 14 n2 = int(s2[j]) if j >= 0 else 0 15 tmp = n1 + n2 + carry 16 carry = tmp // 10 17 res = str(tmp % 10) + res 18 i -= 1 19 j -= 1 20 return '1' + res if carry else res
最后,综述一下所有的代码
1 class Solution(object): 2 def multiply(self,num1,num2): 3 if num1 == "0" or num2 == "0": 4 return "0" 5 l1,l2 = len(num1),len(num2) 6 # 保障num1始终比num2长, 个人习惯 7 if l1 < l2: 8 num1,num2 = num2,num1 9 l1,l2 = l2,l1 10 #倒过来方便进位 11 num2 = num2[::-1] 12 res = "0" 13 for i,digit in enumerate(num2): 14 tmp = self.StringMultiplyDigit(num1,int(digit)) + "0" * i #计算nums1与nums2的当前位的乘积 15 res = self.StringPlusString(res,tmp) #计算每位乘积之和 16 17 return res 18 19 def StringMultiplyDigit(self, param1, param2): 20 ''' 21 进行乘积运算 22 :param param1:str 23 :param param2:int 24 :return:str 25 ''' 26 res = "" 27 i = len(param1) - 1 28 carry = 0 #进位 29 while i >= 0: 30 n1 = int(param1[i]) if i >= 0 else 0 31 tmp = n1 * param2 + carry # tmp : int 32 carry = tmp // 10 # carry : int 33 res = str(tmp % 10) + res # res : str 34 i -= 1 35 return str(carry) + res if carry else res 36 37 38 def StringPlusString(self, s1,s2): 39 ''' 40 进行加法运算 41 :param s1:str 42 :param s2:str 43 :return:str 44 ''' 45 res = "" # 用来存储每位的数字 46 i = len(s1) - 1 # num1的尾部 47 j = len(s2) - 1 # num2的尾部 48 carry = 0 # 看是否产生进位,初始不进位,所以为0 49 while i >= 0 or j >= 0: 50 n1 = int(s1[i]) if i >= 0 else 0 51 n2 = int(s2[j]) if j >= 0 else 0 52 tmp = n1 + n2 + carry 53 carry = tmp // 10 54 res = str(tmp % 10) + res 55 i -= 1 56 j -= 1 57 return '1' + res if carry else res 58 59 num1 = "123" 60 num2 = "456" 61 print(Solution().multiply(num1,num2))
输出结果:56088