我正在努力解决问题:
第一个三角形数的值超过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()
答案 0 :(得分:27)
提示:
n
- 三角数的公式是什么?n
和n+1
没有共同因素(1
除外)。问题:给定n
和n+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循环之前重新计算a
和b
时都应该这样做。if len(l) > 500:
。print a
,但要等到while循环完成。真正让你失望的是,对于每个三角形数字a
,您要检查每个值a / 2
以查看它是否为除数。您只需要检查最多a
平方根的值。这种方式对于x
的每个值,如果x
是除数,则只需将x
和a / 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