我一直试图找到一个超快速代码,可以在0.5秒内计算70000这样一个大数字的阶乘,我自己的代码可以在10秒内完成。我已经到处搜索,我找到的每个代码都有内存错误问题或者没有我想要的那么快。任何人都可以帮我这个吗?
enter code here
import math
num =int(raw_input())
usefrm=0
if len(str(num)) > 2:
if int(str(num)[-2]) % 2 == 0:
usefrm = 'even'
else:
usefrm = 'odd'
else:
if num % 2 == 0:
usefrm = 'even1'
else:
usefrm = 'odd1'
def picknumber(num):
s = str(math.factorial(num))
l = []
for n in s:
if int(n) != 0:
l.append(int(n))
return l[-1]
def picknumber1(num):
s = str(num)
l = []
for n in s:
if int(n) != 0:
l.append(int(n))
return l[-1]
if usefrm == 'even':
e=picknumber1(6*picknumber(int(num/5))*picknumber(int(str(num)[-1])))
if usefrm == 'odd':
e=picknumber1(4*picknumber(int(num/5))*picknumber(int(str(num)[-1])))
else:
e=picknumber1(math.factorial(num))
print e
答案 0 :(得分:0)
尝试使用整数乘法的交换属性。
当相乘的数字很长(它们不适合单个单词)时,执行操作所需的时间会随着它们的长度而超线性增长。
如果先将最小(内存表示最短)因子(和部分产品)相乘,可以节省大量时间。
答案 1 :(得分:0)
对于大多数实际使用,Stirling's approximation非常快且非常准确
import math
from decimal import Decimal
def fact(n):
d = Decimal(n)
return (Decimal(2 * math.pi) * d).sqrt() * (d / Decimal(math.e)) ** d
print(fact(70000))
1.176811014417743803074731978E+308759
答案 2 :(得分:0)
如果您不想要完美的精度,可以使用斯特林的近似值 https://en.wikipedia.org/wiki/Stirling's_approximation
import np
n! ~ np.sqrt(2*np.pi*n)*(n/np.e)**n
表示大n值。这个计算实际上是即时的。
答案 3 :(得分:0)
您可以使用math.factorial()
。例如:
from math import factorial
factorial(7000)
执行时间为20.5毫秒,用于计算 7000 的阶乘:
python -m timeit -c "from math import factorial; factorial(7000)"
10 loops, best of 3: 20.5 msec per loop
答案 4 :(得分:0)
也许您可以尝试利用线程。