该代码应查找具有500个因数的第一个三角数的值。 ProjectEuler的问题12。我已经利用其他人的帮助在p上将整数除以零错误。在这一点上,我想知道是否有人对如何简化问题提供了建议。 (找到第一个有100个除数的三角数大约需要1分钟,而有500个除数的三角数永远不会结束)。目前,我正在尝试寻找一个可能可以利用的数学属性,因为尝试跳过素数之类的事情似乎将花费几乎相同的时间。
import itertools
count = 0
j = 0
for i in itertools.count():
count = 0
if i > 0:
j = i*(i+1)/2
for p in range (1, int(j**0.5)+1):
if j%p == 0:
count+=1
if count > 250:
break
print (int(j))
答案 0 :(得分:0)
对于j
的每个因数小于其平方根,在其平方根上仅存在一个因数。这个事实非常有用,可以计算j
的除数,而仅迭代其平方根。这样可以大大减少所需的工作量。
此外,if count == 500:
应该是if count > 500:
我会发布我的代码,但欧拉计划不鼓励为他们的问题发布完整的解决方案。
答案 1 :(得分:0)
如果使用xrange而不是range,则可以将速度提高23%到25% 我从codereview中学到了这个概念
例如:
divisors(n,start):
if n==1:
return 1
for i in xrange(st, int(math.ceil(math.sqrt(n)))+1):
if n % i == 0:
cnt=1
while(n%i==0):
n/=i
cnt+=1
return divisors(n,i+1)*cnt
return 2
我们找到n的第一个素数p。如果p ^ k是p的最大幂除以n,则(k + 1)*除数(n / p ^ k)是n的除数。 start只是检查素数除数的起点。
for n in xrange(1,1000000):
Tn=(n*(n+1))/2
if n%2==0:
cnt=divisors(n/2)*divisors(n+1)
else:
cnt=divisors(n)*divisors((n+1)/2)
if cnt >= 500:
print Tn
break