zoukankan      html  css  js  c++  java
  • LeetCode#43 Multiply Strings

    Problem Definition:

    Given two numbers represented as strings, return multiplication of the numbers as a string.

    Note: The numbers can be arbitrarily large and are non-negative.

    Solution:

    大数乘法,常用的算法有:Long Multiplication、分治、FFT.

    1)逐位乘。

     1     # @param {string} num1
     2     # @param {string} num2
     3     # @return {string}
     4     def multiply(self, num1, num2):
     5         if num1=='0' or num2=='0':
     6             return '0'
     7         num1,num2=map(int, num1), map(int, num2)
     8         n1,n2=len(num1), len(num2)
     9         result=[0]*(n1+n2)
    10         for i in range(n1-1, -1, -1):
    11             carry=0
    12             for j in range(n2-1, -1, -1):
    13                 pz=(n1-1-i)+(n2-1-j)
    14                 result[pz]+=carry+num1[i]*num2[j]
    15                 carry=result[pz]/10
    16                 result[pz]%=10
    17             result[n1-1-i+n2]+=carry
    18         19         while result[-1]=='0':
    20             result.pop()
    21         return ''.join(map(str, result[::-1]))

    2)分组乘。64位的二进制数可以表达19位的十进制数,因此两个9位十进制数的乘积可以用64位二进制数存放而不溢出。

    因此可以把用数组表示的大整数,每9位为一组,然后group-by-group地相乘,比digit-by-digit会快些。要预处理,对数位分组。

     1     # @param {string} num1
     2     # @param {string} num2
     3     # @return {string}
     4     def multiply(self, num1, num2):
     5         # convert number string into list of 9-digit numbers
     6         def _convert2List(numString):
     7             numList = [0] * ((len(numString) + 8) // 9)
     8             # store 9-digit number in reverse order
     9             numList[0] = int(numString[-9:])
    10             for index in range(1, len(numList)):
    11                 numList[index] = int(numString[-(index+1)*9 : -index*9])
    12             return numList
    13 
    14         # multiply a number list with a at most 9-digit multiplier
    15         def _multiplySingle(result, start, numList, multiplier):
    16             carry = 0
    17             for index in range(len(numList)):
    18                 resultIndex = index + start
    19                 carry += (numList[index] * multiplier) + result[resultIndex]
    20                 carry, result[resultIndex] = divmod(carry, 1000000000)
    21             result[len(numList) + start] = carry
    22 
    23         if num1 == '0' or num2 == '0':
    24             return '0'
    25         # convert string to integer
    26         num1List, num2List = _convert2List(num1), _convert2List(num2)
    27         result = [0] * ((len(num1) + len(num2) + 16) // 9)
    28         for index in range(len(num2List)):
    29             _multiplySingle(result, index, num1List, num2List[index])
    30 
    31         # remove leading 0s
    32         while result[-1] == 0:
    33             result.pop()
    34         # convert to string
    35         return str(result[-1]) + ''.join(map(lambda x : string.zfill(x, 9), result[:-1][::-1]))

    实际上直接写

    return str(int(num1)*int(num2))

    也能通过,因为Python本身就有处理溢出的机制。int会被自动转换成long,而long是大整数类型,限制其长度的是内存大小。

  • 相关阅读:
    数据结构 字符串的长度
    滚动条
    git push 一直卡在 writing objects 然后 就提交失败 提示:unexpected-disconnect-while-reading-sideband-packet
    vue中的防抖和节流
    html5中output元素详解
    手写 apply call bind 三个方法
    js中的陷阱!!!
    display:inline-block元素之间空隙的产生原因和解决办法
    git push到Gitee的时候上传不成功,可能是本地文件夹与远程仓库不同步
    axios没有实现jsonp这个功能,基于axios自己扩展一个
  • 原文地址:https://www.cnblogs.com/acetseng/p/4702500.html
Copyright © 2011-2022 走看看