繁体   English   中英

查找第一个三角形数大于500的因子的代码将无法完成运行

[英]Code finding the first triangular number with more than 500 divisors will not finish running

好的,所以我正在研究Euler问题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该函数,并将结果在factors变量。 循环继续运行,并且y变量继续增加,直到因子数量超过500。然后打印结果。

但是,当我运行它时,什么也没发生-没有错误,没有输出,它一直在运行。 现在,我知道我的代码不是最有效的,但是我让它运行了相当长的时间,但仍然没有产生结果,所以在我看来,某处有一个错误。 我已经看过它了,似乎找不到错误。

我只是要求不要给出完整的解决方案或经过彻底改进的解决方案,而要指出我的错误或需要改进的地方,因为我做Euler问题的原因是为了改进编码。 谢谢!

您的算法效率很低。

如果您要求提供指针而非完整解决方案,则主要指针为:

  1. 有一种更有效的方法来计算下一个三角数 Wiki中有一个明确的公式。 同样,如果您生成所有数字的序列,则将下一个n添加到前一个数字会更有效。 sum(list(range(1,n)))旁注list对我来说根本没有意义。)如果您仍要使用此方法, sum(xrange(1,n)可能会更有效不需要实现范围)

  2. 有很多更有效的因式分解因子

  3. 有一种更有效的方法来计算因子数量。 它实际上是在Euler之后调用的:请参见Euler的totient函数

通常,不应以纯粹的蛮力解决Euler项目问题​​(就像在许多其他编程竞赛中一样)。 您应该首先提出一些公式和/或更有效的算法。

据我所知,您的代码可以工作,但是计算因子数量将花费很长时间。 对于150个因数,运行大约需要20秒,随着您寻找越来越多的因数,该时间将急剧增加。

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

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

从外观上看,代码可以正常工作,但这并不是最佳方法。 例如,一种简单的优化方法就是将数量减少一半。 另外,尝试考虑如何使用主要因素来完成此操作,这可能是另一种解决方案。 祝你好运!

首先,您必须定义一个因子函数:

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(factors(a))= 500处停止。简单打印(a),您将得到答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM