您的位置:首页 > 其它

LeetCode#43 Multiply Strings

2015-08-04 16:58 176 查看
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)逐位乘。

# @param {string} num1
# @param {string} num2
# @return {string}
def multiply(self, num1, num2):
if num1=='0' or num2=='0':
return '0'
num1,num2=map(int, num1), map(int, num2)
n1,n2=len(num1), len(num2)
result=[0]*(n1+n2)
for i in range(n1-1, -1, -1):
carry=0
for j in range(n2-1, -1, -1):
pz=(n1-1-i)+(n2-1-j)
result[pz]+=carry+num1[i]*num2[j]
carry=result[pz]/10
result[pz]%=10
result[n1-1-i+n2]+=carry
while result[-1]=='0':
result.pop()
return ''.join(map(str, result[::-1]))


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

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

# @param {string} num1
# @param {string} num2
# @return {string}
def multiply(self, num1, num2):
# convert number string into list of 9-digit numbers
def _convert2List(numString):
numList = [0] * ((len(numString) + 8) // 9)
# store 9-digit number in reverse order
numList[0] = int(numString[-9:])
for index in range(1, len(numList)):
numList[index] = int(numString[-(index+1)*9 : -index*9])
return numList

# multiply a number list with a at most 9-digit multiplier
def _multiplySingle(result, start, numList, multiplier):
carry = 0
for index in range(len(numList)):
resultIndex = index + start
carry += (numList[index] * multiplier) + result[resultIndex]
carry, result[resultIndex] = divmod(carry, 1000000000)
result[len(numList) + start] = carry

if num1 == '0' or num2 == '0':
return '0'
# convert string to integer
num1List, num2List = _convert2List(num1), _convert2List(num2)
result = [0] * ((len(num1) + len(num2) + 16) // 9)
for index in range(len(num2List)):
_multiplySingle(result, index, num1List, num2List[index])

# remove leading 0s
while result[-1] == 0:
result.pop()
# convert to string
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是大整数类型,限制其长度的是内存大小。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: