您的位置:首页 > 理论基础 > 计算机网络

https://leetcode.com/problems/multiply-strings/

2015-05-07 22:40 453 查看
https://leetcode.com/problems/multiply-strings/

因为数字很大 不能进行普通乘法 

想到用分解乘法的步骤 



长串和单位数字的乘法 就是 按位做乘法 

积+进位%10=得数 

积+进位/10=进位

最后在单独把最后一次的进位放在最前面

singlemul()就做了这件事

——————————————————

然后得到每一次的乘积之后,按位做加法

和+进位%10=得数 

和+进位/10=进位

最后再把进位放在最前面 

——————————————————

最最后处理串前面多余的0即可

问题是 有的case会超时

我发现 当位数比较多的时候 假设1已经乘过一遍了 可能还会再乘很多遍 

因此把 0-9和数的乘积都放在modul[]里 需要拿出来用,不用再算 

应该还有更好的方法 

class Solution:
# @param {string} num1
# @param {string} num2
# @return {string}
def singlemul(self,m,k):
#m is the number k is a digit
sol=''
up=0
for i in m[::-1]:
single=(int(i)*int(k)+up)%10
up=(int(i)*int(k)+up)/10
sol=str(single)+sol
sol=str(up)+sol
return sol

def multiply(self, num1, num2):
#拆n
#单独计算每一位 然后组成字符串
if len(num1)>len(num1):
n=num1
m=num2
else:
m=num1
n=num2
sol=['']*len(n)
modul=['']*10
for i in range(10):
modul[i]=Solution().singlemul(m,i)
for i in range(len(n))[::-1]:
sol[i]=modul[int(n[i])]+'0'*(len(n)-1-i)
maxlength=len(sol[0])
for i in range(len(sol)):
sol[i]=(maxlength-len(sol[i]))*'0'+sol[i]
#此时sol各项已经位数相同(maxlength位) 加和即可
final=''
up=0
sum=0
this=''
for i in range(maxlength)[::-1]:
sum=0
for j in range(len(n)):
sum=sum+int(sol[j][i])
thisdigit=str((sum+up)%10)
up=(sum+up)/10
final=thisdigit+final
#可能会进位
final=str(up)+final
#最后处理这个字符串 去掉左侧0
if int(final)==0:
final='0'
else:
k=0
for i in range(len(final)):
if final[i]!='0':
final=final[i:]
break
return final
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: