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
因为数字很大 不能进行普通乘法
想到用分解乘法的步骤
长串和单位数字的乘法 就是 按位做乘法
积+进位%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
相关文章推荐
- leetcode 1B https://oj.leetcode.com/problems/binary-tree-level-order-traversal/
- https://leetcode.com/problems/sqrtx/
- https://leetcode.com/problems/pascals-triangle/
- https://leetcode.com/problems/spiral-matrix/
- https://oj.leetcode.com/problems/majority-element/
- https://leetcode.com/problems/search-insert-position/
- https://leetcode.com/problems/add-binary/
- https://leetcode.com/problems/longest-common-prefix/
- https://oj.leetcode.com/problems/majority-element/
- leetcode shttps://oj.leetcode.com/problems/surrounded-regions/
- https://leetcode.com/problems/spiral-matrix-ii/
- https://leetcode.com/problems/powx-n/
- https://leetcode.com/problems/plus-one/
- https://leetcode.com/problems/rotate-image/
- https://leetcode.com/problems/evaluate-reverse-polish-notation/
- https://leetcode.com/problems/candy/
- https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
- https://leetcode.com/problems/implement-strstr/
- https://leetcode.com/problems/valid-parentheses/
- https://leetcode.com/problems/gas-station/