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)逐位乘。
2)分组乘。64位的二进制数可以表达19位的十进制数,因此两个9位十进制数的乘积可以用64位二进制数存放而不溢出。
因此可以把用数组表示的大整数,每9位为一组,然后group-by-group地相乘,比digit-by-digit会快些。要预处理,对数位分组。
实际上直接写
也能通过,因为Python本身就有处理溢出的机制。int会被自动转换成long,而long是大整数类型,限制其长度的是内存大小。
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是大整数类型,限制其长度的是内存大小。
相关文章推荐
- JQuery onload、ready概念介绍及使用方法
- CSS的float与clear
- 《R语言实战》读书笔记--第二章 创建数据集
- OC的动态性
- java生成word文档【二】
- Axsure快捷键
- windows资料
- poj 2253 Frogger
- 行为型模式-备忘录模式
- 使用注解方式进行spring和hibernate整合
- 深入理解java字节流与字符流
- popupwindow弹出后,屏幕背景变成半透明
- Speex manul(手册)中文版
- Android屏幕适配---dimens转换工具
- ViewGroup的onMeasure和onLayout分析
- 多校五 HDU
- 给HTML标签绑定事件
- 验证手机号的正则表达式
- AVL平衡二叉树
- rtcp原理