【发布时间】:2018-07-06 18:43:06
【问题描述】:
我正在处理Project Euler 的第 45 题。提示如下:
三角形、五边形和六边形数由以下公式生成:
Tn= n(n+1) / 2
Pn= n(3 n − 1) / 2
Hn= n(2 n -1)
可以验证T285 = P165 = H143 = 40755。
找出下一个三角形数,它也是五边形和六边形。
我确实有一个可行的解决方案,但我在提供不依赖于 range 的任意值的答案时遇到了一些困难。
我当前的代码:
import collections
import time
start_time = time.time()
nums = []
for x in range(56000):
t, p, h = (x * (x + 1) / 2) , x * (((3 * x) - 1) / 2), (x * ((2 * x) - 1))
nums.extend([t, p, h])
j = [i for i, count in collections.Counter(nums).items() if count > 2]
pos = j.index(40755)
result = j[pos + 1]
print result
print("--- %s seconds ---" % (time.time() - start_time))
输出:
1533776805
--- 0.197566986084 秒 ---
如何在不使用range 的情况下在相同的时间内找到相同的答案?我想获得相同的输出,但不指定迭代次数。我尝试使用itertools.count,但在nums 列表中搜索符合上述条件的值需要很长时间。
提前致谢。
【问题讨论】:
-
@RBalasubramanian 只是因为我必须将任意值传递给范围,直到找到正确答案。
-
经过进一步思考 - 我不明白这个问题(尤其是
itertools.count是如何不起作用的) -
Project Euler 45 here已经有很好的文档了