已修正错误,效率反馈Euler 12项目

时间:2019-06-04 23:31:07

标签: python

该代码应查找具有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))    

2 个答案:

答案 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