我试图解决欧拉项目的问题12。拥有超过500个除数的第一个三角形数的值是多少? (第7个三角形数字为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
if count>maxcount:
maxcount=count
print a, "has", maxcount, "dividors"
谢谢!
答案 0 :(得分:1)
从这个问题中抓取代码,实现非常快速的素数分解:
Fast prime factorization module
然后使用此问题的答案将您的素数因子转换为所有除数的列表(长度是您想要的):
What is the best way to get all the divisors of a number?
例如,您可以从第一个链接将以下函数(从第二个链接改编)添加到模块的底部:
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
然后在您的代码中计算除数,您将使用len(list(alldivisors(a)))
,它将比您当前使用的强力方法更快地计算除数的数量。
答案 1 :(得分:1)
从缩小搜索空间开始,无需查看非三角数字的数字。另请尝试查看range(1, sqrt(n))
中的除数,而不是range(1, n)
答案 2 :(得分:0)
除了数论之外:尝试缓存,并以相反的方式做事。例如:当你已经知道300有18个除数(以及它们是什么)时,这对于一个可以被300分割的数字意味着什么?你可以缓存这些信息吗? (当然可以。)
纯python加速黑客无法帮助你,你需要一个更好的算法。