Python 优化有助于找到最大除数
我正在尝试解决Euler项目的问题12。第一个有500个以上除数的三角形数的值是多少?(第七个三角形的数字是1+2+3+4+5+6+7=28)。这是我的代码,但速度不够快。。 你有什么优化建议吗Python 优化有助于找到最大除数,python,Python,我正在尝试解决Euler项目的问题12。第一个有500个以上除数的三角形数的值是多少?(第七个三角形的数字是1+2+3+4+5+6+7=28)。这是我的代码,但速度不够快。。 你有什么优化建议吗 n=0 a=0 list=[] maxcount=0 while True: n+=1 a+=n count=0 for x in range(1,int(a+1)): if a%x==0: count+=1
n=0
a=0
list=[]
maxcount=0
while True:
n+=1
a+=n
count=0
for x in range(1,int(a+1)):
if a%x==0:
count+=1
if count>maxcount:
maxcount=count
print a, "has", maxcount, "dividors"
谢谢大家! 除了数论之外:尝试缓存,然后反过来做。例如:当您已经知道300有18个除数(以及它们是什么)时,对于一个可以被300除数的数字来说,这意味着什么?你能缓存这些信息吗?(当然可以。)
纯python加速黑客帮不了你,你需要一个更好的算法。从这个问题中获取实现快速素数分解的代码:
然后使用此问题的答案将素因子转换为所有除数的列表(长度是您想要的):
例如,您可以将以下功能(从第二个链接改编)从第一个链接添加到模块底部:
def alldivisors(n):
factors = list(factorization(n).items())
nfactors = len(factors)
f = [0] * nfactors
while True:
yield reduce(lambda x, y: x*y, [factors[x][0]**f[x] for x in range(nfactors)], 1)
i = 0
while True:
if i >= nfactors:
return
f[i] += 1
if f[i] <= factors[i][1]:
break
f[i] = 0
i += 1
def所有除数(n):
因子=列表(因子分解(n).items())
nfactors=len(因子)
f=[0]*n因子
尽管如此:
产量减少(λx,y:x*y,[系数[x][0]**f[x]表示范围内的x(非因子)],1)
i=0
尽管如此:
如果i>=nfactors:
返回
f[i]+=1
如果f[i]从减少搜索空间开始,则无需查看不是三角形的数字。还可以尝试查看范围(1,sqrt(n))中的除数
而不是范围(1,n)
仅检查数字sqrt以下的除数。节省数百万张支票