大数
发布时间:2020-12-14 01:33:07 所属栏目:大数据 来源:网络整理
导读:1. n!有多少个0? # 有多少个数能被5整除就有多少个0 def how_many_zero (n) : zero = 0 for i in range( 1 ,n+ 1 ): if i % 5 == 0 : zero += 1 print zero 想了一下,上面的是错误答案,比如,25=5*5,可以分解为2个5,所以乘以25以后会得到2个0:) 再加
1. n!有多少个0?# 有多少个数能被5整除就有多少个0
def how_many_zero(n):
zero = 0
for i in range(1,n+1):
if i % 5 == 0:
zero += 1
print zero
想了一下,上面的是错误答案,比如,25=5*5,可以分解为2个5,所以乘以25以后会得到2个0:) def how_many_zero_2(n):
if n <= 0:
return False
zero = 0
for i in range(1,n+1):
while i % 5 == 0:
zero += 1
i = i / 5
print zero
ps. 125!除以10^31的余数: 2.大数乘法参考文章:大数乘法的几种算法分析及比较(2014腾讯南京笔试题) 方法1.手工模拟计算优点:通俗易懂 如
17
* 25 ---------
5 35
2 14 ---------
2 19 35 ---------
4 2 5 ---------
425
关键:两个循环 a(i)*b(j) def big_number_multiply(a,b):
"""
big number multiply
:param a: String e.g. "222222222234567890"
:param b: String e.g. "333334444434567890"
:return: String a*b
"""
res = [0]*(len(a)+len(b))
a = a[::-1]
b = b[::-1]
for i in range(len(a)):
for j in range(len(b)):
res[i+j] = a[i] * b[j]
# deal with carrying
carry = 0
for i in len(res): # 放心,不会出现下标溢出的
if res[i] > 9:
carry = res[i] / 10
res[i] %= res[i]
res[i+1] += carry
return "".join([str(x) for x in res[::-1]])
方法2 分治算法分治算法虽然时间复杂度降低为O(N^(log3))=O(N^1.58), 方法3 FFT算法实现更复杂。。 3.大数减法# 写的有点渣。。
def big_number_minus(minuend,subtracter):
# 假设被减数 > 减数 , 不然要自己判断,加负号等等
res = []
minuend = minuend[::-1]
subtracter = subtracter[::-1]
for i in range(len(subtracter)):
tmp = int(minuend[i]) - int(subtracter[i])
if tmp < 0:
tmp += 10
j = i + 1
while int(minuend[j]) == 0:
minuend[j] = str(9)
j += 1
minuend = minuend[:j]+str(int(minuend[j]) - 1) + minuend[j:]
res.append(tmp)
for i in range(len(subtracter),len(minuend)):
res.append(int(minuend[i])
print "".join([str(x) for x in res[::-1]])
4.大数除法和求余主要是如何快速做减法,主要是迅速扩大倍数 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |