Python活力练习Day22

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

原文地址:https://www.cnblogs.com/xiaodangdang/p/12160392.html