LeetCode使用python实现字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例2:

输入: num1 = "123", num2 = "456"
输出: "56088"
  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

二、思路

看到这题的时候就想着直接转换成整数就可以计算了呀,但是题目要求不能这样。那好吧,那我自己制定转换方式不过这样不太好。还是用蠢办法来写吧,直接模仿人类的计算方式来写:

  1. 按照习惯先计算低位,所以讲两个数组倒过来
  2. 判断实现是否有进位的情况,如果没有则进行按位相乘,如果有进位则进位数+乘积
  3. 判断乘积是否大于9,是则进位。
  4. 将之前计算出来的结果与乘积相加。依旧要判断是否需要进位
  5. 注意:需要判断最高位是否还有进位的情况。

三、代码

# _*_ coding:utf-8 _*_
'''
    @author:xianyt
    @date:2018/
    @func:
    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
'''
class Solution(object):
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        if num1=="0" or num2=="0":
            return "0"
        result = [0 for i in range(len(num1)-1)]
        len_num2 = len(num2)
        num1 = num1[::-1]
        num2 = num2[::-1]
        #处理进位
        carry = [0 for i in range(len(num1)+len(num2))]
        for l2 in range(len_num2):
            i = l2
            result.append(0)
            for n1 in num1:
                if carry[i] != 0:
                    # 判断之前是否有进位的情况,清空已经处理的进位
                    result[i] += carry[i]
                    carry[i] = 0
                mul = int(num2[l2])*int(n1)
                #判断按位相乘的积是否是个位数
                if mul>9:
                    carry[i+1] += mul//10
                result[i] += (mul%10)
                # 判断结果是否是个位数
                if result[i] > 9:
                    carry[i+1] += result[i]//10
                    result[i] = result[i] % 10
                i += 1
        if carry[len(result)] != 0:  #判断最高位是否还有进位
            result.append(carry[len(result)])
        p = ''.join(str(i) for i in result)
        p = p[::-1]
        return p




if __name__ == "__main__":
    solu = Solution()
    print(solu.multiply("2", "3"))  #6
    print(solu.multiply("723", "10"))  #7230
    print(solu.multiply("111", "94"))  #10434
    print(solu.multiply("234", "673"))  #157482
    print(solu.multiply("234", "73"))  #17082
    print(solu.multiply("111", "43"))  #4773
    print(solu.multiply("243", "4"))   #97
    print(solu.multiply("97", "4773"))   #462981
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值