Python 错误修复,效率反馈项目12

Python 错误修复,效率反馈项目12,python,Python,这段代码应该找到第一个有500个除数的三角形数的值。ProjectEuler的问题12。我在别人的帮助下修正了p上的整数除以零的错误。在这一点上,我想知道是否有人有一个如何简化问题的提示。(找到第一个具有100个除数的三角形数需要约1分钟,而具有500个除数的三角形数永远不会完成)。目前,我正试图找到一个数学性质,我可能能够利用它,因为做一些事情,比如试图跳过素数,似乎也需要同样长的时间 导入itertools 计数=0 j=0 对于itertools.count()中的i: 计数=0 如果i>

这段代码应该找到第一个有500个除数的三角形数的值。ProjectEuler的问题12。我在别人的帮助下修正了p上的整数除以零的错误。在这一点上,我想知道是否有人有一个如何简化问题的提示。(找到第一个具有100个除数的三角形数需要约1分钟,而具有500个除数的三角形数永远不会完成)。目前,我正试图找到一个数学性质,我可能能够利用它,因为做一些事情,比如试图跳过素数,似乎也需要同样长的时间

导入itertools
计数=0
j=0
对于itertools.count()中的i:
计数=0
如果i>0:
j=i*(i+1)/2
对于范围(1,int(j**0.5)+1)内的p:
如果j%p==0:
计数+=1
如果计数>250:
打破
印刷(国际(j))

对于
j
的每一个小于其平方根的除数,其平方根上正好有一个除数。这一事实非常有用,可以计算
j
的除数,同时只迭代到其平方根。这大大减少了所需的工作量

另外,
如果计数==500:
应该是
如果计数>500:


我会发布我的代码,但欧拉计划不鼓励发布他们问题的完整解决方案。

对于
j
的每一个小于其平方根的除数,其平方根上正好有一个除数。这一事实非常有用,可以计算
j
的除数,同时只迭代到其平方根。这大大减少了所需的工作量

另外,
如果计数==500:
应该是
如果计数>500:


我会发布我的代码,但Project Euler不鼓励发布他们问题的完整解决方案。

如果使用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
我们发现p是n的第一个素因子。如果p^k是p除以n的最大幂,(k+1)*除数(n/p^k)是n的除数。开始只是检查素数因子的起点

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

如果使用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
我们发现p是n的第一个素因子。如果p^k是p除以n的最大幂,(k+1)*除数(n/p^k)是n的除数。开始只是检查素数因子的起点

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


对范围(1,int(j**0.5)+1)内的p尝试
。错误来自
j%p
当p为0时“我没有遵循哪些准则来保证对我发表的每一篇文章投反对票?”——在这种情况下,它发布了一个离题问题。你的代码是有效的,你需要的是一般性的反馈。具体问题也是如此。主要基于观点的问题是离题的。你可以阅读有关主题的文章。您还可以在中阅读有关提问的提示。@Chris,请注意,这个问题最初是关于零分错误的,现在是一个完全不同的问题。德里克,这是违反规定的。此外,不允许在评论中提出后续问题。Stack Overflow是一个问答网站,不是一个帮助论坛。请阅读、、和,特别是如果你所有的帖子都被否决了。注意:另请看@DerekLuna,这对我来说并不是一个具体的问题:“在这一点上,我想知道是否有人有关于如何简化问题的建议。”也许可以用主题的方式问这个问题,但事实并非如此。同样,请阅读中的主题并阅读。尝试
获取范围(1,int(j**0.5)+1)内的p
。错误来自
j%p
当p为0时“我没有遵循哪些准则来保证对我发表的每一篇文章投反对票?”——在这种情况下,它发布了一个离题问题。你的代码是有效的,你需要的是一般性的反馈。具体问题也是如此。主要基于观点的问题是离题的。你可以阅读有关主题的文章。您还可以在中阅读有关提问的提示。@Chris,请注意,这个问题最初是关于零分错误的,现在是一个完全不同的问题。德里克,这是违反规定的。此外,不允许在评论中提出后续问题。Stack Overflow是一个问答网站,不是一个帮助论坛。请阅读、、和,特别是如果你所有的帖子都被否决了。注意:另请看@DerekLuna,这对我来说并不是一个具体的问题:“在这一点上,我想知道是否有人有关于如何简化问题的建议。”也许可以用主题的方式问这个问题,但事实并非如此。同样,请阅读和阅读中的主题。这假设OP使用的是Py2.X。对于Py3来说,这不再是事实。如果可以的话,我建议您转移到Py3,因为Py2.X很快就要下线了。@AChampion谢谢您提供的信息,我也会为PYN3创建这个。这假设OP使用的是Py2.X。对于Py3来说,这不再是事实。如果可以的话,我建议您转移到Py3,因为Py2.X很快就要下线了。@AChampion谢谢您提供的信息,我也会为Python3创建一个。对于范围(1,int(j**0.5)+1)内的p:如果j%p==0:count+=2count==100,那么这个速度非常快,而且似乎是正确的。count==500到目前为止已经有2分钟了。我检查了几个大的值,似乎是错误的,试图修复它。@DerekLuna您需要检查count>500,而不是count==500我需要找到第一个这样的三角形数,它有500个除数。对于范围(1,int(j**0.5)+1)中的p:如果j%p==0:count+=2count==100,这一点非常快,而且似乎是正确的。count==500到目前为止已经有2分钟了。我检查了几个较大的值,但似乎不正确,正在尝试修复它。@DerekLuna您需要检查count