代码查找超过500个除数的第一个三角形数字将无法完成运行

时间:2017-05-13 23:01:36

标签: python python-3.x math

好的,我正在研究Euler Problem 12(找到第一个三角形数字,其中有多个因子超过500),我的代码(在Python 3中)如下:

factors = 0
y=1

def factornum(n):
    x = 1
    f = []
    while x <= n:
        if n%x == 0:
            f.append(x)
        x+=1
    return len(f)

def triangle(n):
    t = sum(list(range(1,n)))
    return t

while factors<=500:
    factors = factornum(triangle(y))
    y+=1

print(y-1)

基本上,函数遍历输入数字n下面的所有数字,检查它们是否均匀分成n,如果是,则将它们添加到列表中,然后返回该列表中的长度。另一个通过将列表中的所有数字从1与输入数相加并返回总和来生成三角数。然后while循环继续使用迭代变量y作为triangle函数的输入生成三角形数字,然后在其上运行factornum函数并将结果放入{ {1}}变量。循环继续运行,factors变量继续递增,直到因子数超过500.然后打印结果。

然而,当我运行它时,没有任何反应 - 没有错误,没有输出,它只是保持运行和运行。现在,我知道我的代码不是最有效的,但我让它运行了很长时间,但它仍然没有产生结果,所以我觉得更有可能是某处出错。我已经过了它并且无法找到错误。

我只是要求一个完整的解决方案或一个彻底改进的解决方案不是完全给出的,而是指向我的错误或改进的地方,因为我正在做欧拉的原因问题是改善我的编码。谢谢!

4 个答案:

答案 0 :(得分:3)

你的算法非常低效。

如果你要求指针而不是完整解决方案,主要指针是:

  1. 有一种更有效的方法来计算下一个triangular number。维基中有一个明确的公式。此外,如果您生成所有数字的序列,则将下一个n添加到前一个数字会更有效。 (list中的旁注sum(list(range(1,n)))对我毫无意义。如果你想要使用这种方法,sum(xrange(1,n)可能会更有效率,因为它不需要实现范围)

  2. factorize numbers

  3. 提供了更有效的方法
  4. 有一种更有效的方法来计算因子数量。它实际上是在欧拉之后调用的:见Euler's totient function

  5. 一般来说,欧拉项目问题(如许多其他编程竞赛中)不应该由纯粹的蛮力来解决。你应该首先想出一些公式和/或更有效的算法。

答案 1 :(得分:1)

据我所知,您的代码可行,但计算因子数量需要很长时间。对于150个因子,运行需要大约20秒,并且当您寻找越来越多的因子时,该时间将急剧增长。

减少处理时间的一种方法是减少您正在执行的计算次数。如果你分析你的代码,你每次都在计算n%1,这是一个不必要的计算,因为你知道每个整数都可以被自身和一个整除。还有其他方法可以减少计算次数吗?也许记住,如果一个数字可以被20整除,它也可以被2,4,5和10整除?

我可以更具体一点,但你想要一个指向正确方向的指针。

答案 2 :(得分:1)

从它的外观来看,代码运行良好,它不是最好的方法。例如,一种简单的优化方法是直到数字的一半。此外,尝试考虑如何使用素数因子来做到这一点,它可能是另一种解决方案。祝你好运!

答案 3 :(得分:0)

首先你需要确定一个因子函数:

from functools import reduce

def factors(n):
    step = 2 if n % 2 else 1
    return set(reduce(list.__add__,
                  ([i, n//i] for i in range(1, int(pow(n,0.5) + 1)) if n % i 
== 0)))

这将创建一个集合并将所有数字n的因子放入其中。

其次,使用while循环直到获得500个因子:

a = 1
x = 1
while len(factors(a)) < 501:
    x += 1
    a += x

此循环将停在len(因子(a))= 500。 简单的打印(a),你会得到你的答案。