python中的三角形数字

时间:2009-02-20 22:27:36

标签: python

我正在努力解决问题:

  

第一个三角形数的值超过500个除数是多少?

三角形数字是数字总和序列中的数字,即1 + 2 + 3 + 4 + 5 ......

我很确定这是正常工作的代码,但我不知道,因为我的电脑计算时间太长。有没有人知道如何使程序更快一点  感谢。

import math

def main():
    l = []
    one = 0
    a = 1
    b = 2
    while one == 0:
        a = a + b 
        b += 1
        for x in range(1, int(a/2 + 1)):
            if a % x == 0:
                l.append(x)
                if len(l) > 499:
                    print a 

if __name__ == '__main__':
    main()

6 个答案:

答案 0 :(得分:27)

提示:

  • n - 三角数的公式是什么?
  • nn+1没有共同因素(1除外)。问题:给定nn+1中的因素数量如何计算n*(n+1)中的因子数量?那么n/2(n+1)(或n(n+1)/2)呢?
  • 如果您知道n如何计算n的除数的所有素因子?

如果您不想更改算法,则可以通过以下方式加快算法速度:

  • l.append替换为factor_count += 1
  • 枚举为int(a**.5)而不是a/2(在这种情况下使用factor_count += 2)。

答案 1 :(得分:6)

你必须多考虑并使用较少的蛮力来解决Project Euler的问题。

在这种情况下,您应该调查三角形数具有哪个和有多少除数。从头开始,寻找模式,尝试理解问题。

答案 2 :(得分:5)

您没有更新one的值,因此您的程序永远不会结束。

答案 3 :(得分:5)

为了理智,你应该使用

while True:

并摆脱one

答案 4 :(得分:5)

首先,人们告诉你,你不能在一分钟内用蛮力解决这个问题是错误的。针对此大小问题的强力算法将在几秒钟内运行。

其次,您发布的代码有几个问题,其中一些已经提到过。

  • 您应该在达到目标条件(当前one)后将0设置为print a以外的某个值来终止循环。
  • 您永远不会重新初始化列表(l = [])。每次在进入for循环之前重新计算ab时都应该这样做。
  • 问题要求第一个三角形数字超过五百个除数。您的终止条件应为if len(l) > 500:
  • 你可能不想在for循环中print a,但要等到while循环完成。

真正让你失望的是,对于每个三角形数字a,您要检查每个值a / 2以查看它是否为除数。您只需要检查最多a平方根的值。这种方式对于x的每个值,如果x是除数,则只需将xa / x添加到列表中。

这是您的代码,其中包含我在上面概述的修改:

import math

def main():
    l = []
    one = 0
    a = 1
    b = 2
    while one == 0:
        a = a + b 
        b += 1
        l = []

        sqrt_a = int(math.sqrt(a))

        for x in range(1, sqrt_a + 1):
            if a % x == 0:
                l.append(x)
                if x < math.sqrt(a):
                    l.append(a // x)
                if len(l) > 500:
                    # print(a)
                    one = 1

    print(a, b, len(l))

if __name__ == '__main__':
    main()

你会发现它会在大约5或6秒内运行,所以在一分钟内完成这些修改。

答案 5 :(得分:3)

您目前的强力算法效率太低,无法在1分钟的Project Euler时间限制内解决此问题。相反,我建议看看除数函数:

http://www.artofproblemsolving.com/Wiki/index.php/Divisor_function