zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CF446DDZY Loves Games【高斯消元,矩阵乘法】
    PHP操作MongoDB数据库
    PHP linux spl_autoload_register区分大小写
    win7 64位安装redis 及Redis Desktop Manager使用
    svn的搭建
    php 扩展 redis
    CI reids 缓存
    拿起键盘写下我的第一封博客
    自我介绍
    课程目标
  • 原文地址:https://www.cnblogs.com/xiaodangdang/p/12160392.html
Copyright © 2011-2022 走看看