[英]python program for finding triangular number with more than 500 divisors
[英]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问题的原因是为了改进编码。 谢谢!
您的算法效率很低。
如果您要求提供指针而非完整解决方案,则主要指针为:
有一种更有效的方法来计算下一个三角数 。 Wiki中有一个明确的公式。 同样,如果您生成所有数字的序列,则将下一个n
添加到前一个数字会更有效。 ( sum(list(range(1,n)))
旁注list
对我来说根本没有意义。)如果您仍要使用此方法, sum(xrange(1,n)
可能会更有效不需要实现范围)
有很多更有效的因式分解因子
有一种更有效的方法来计算因子数量。 它实际上是在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.