Python中的高效迭代,而不使用范围
我正在处理的是第45题。提示如下: 三角形、五边形和六边形数由以下公式生成: Tn=n(n+1)/2 Pn=n(3n− 1) /2 Hn=n(2 n−(一) 可以验证T285=P165=H143=40755 找到下一个同样是五边形和六边形的三角形编号。 我确实有一个可行的解决方案,但我在提供一个答案时遇到了一些困难,这个答案不依赖于对Python中的高效迭代,而不使用范围,python,for-loop,math,Python,For Loop,Math,我正在处理的是第45题。提示如下: 三角形、五边形和六边形数由以下公式生成: Tn=n(n+1)/2 Pn=n(3n− 1) /2 Hn=n(2 n−(一) 可以验证T285=P165=H143=40755 找到下一个同样是五边形和六边形的三角形编号。 我确实有一个可行的解决方案,但我在提供一个答案时遇到了一些困难,这个答案不依赖于对范围使用任意值 我的当前代码: import collections import time start_time = time.time() nums = []
范围使用任意值
我的当前代码:
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))
输出:
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秒---
如果不使用范围
,如何在相同的时间内找到相同的答案?我希望获得相同的输出,但不指定迭代次数。我尝试使用itertools.count
,但在nums
列表中搜索与上述条件匹配的值花费的时间太长
提前感谢。更好的方法是循环遍历六边形数的所有索引,然后看到这些数中的一个也是五边形数。(正如@Mbo在一篇评论中告诉我的,所有的六边形数字也是三角形数字,所以我们可以跳过这个检查。)没有必要尝试任何更高的六边形数字。这是我解决这个问题的代码,它使用了一个while
循环,没有任何范围。询问您是否需要更多关于从三角形或五边形数计算指数的公式的解释
"""Project Euler #0045 Triangular, pentagonal, and hexagonal
Triangle, pentagonal, and hexagonal numbers are generated by the
following formulae:
Triangle T(n)=n(n+1)/2 1, 3, 6, 10, 15, ...
Pentagonal P(n)=n(3n−1)/2 1, 5, 12, 22, 35, ...
Hexagonal H(n)=n(2n−1) 1, 6, 15, 28, 45, ...
It can be verified that T(285) = P(165) = H(143) = 40755.
Find the next triangle number that is also pentagonal and hexagonal.
ANSWER: T(55385) = P(31977) = H(27693) = 1533776805
"""
from math import sqrt
_1_50 = 1 << 50 # 2**50 == 1,125,899,906,842,624
known_answer_hexagonal = 143
n_hex = known_answer_hexagonal
x = 1
while x <= _1_50:
n_hex += 1
x = n_hex * (2 * n_hex - 1) # we know this is hexagonal
sqrt_pen = sqrt(1 + 24 * x)
if not sqrt_pen.is_integer():
continue
n_pen = (sqrt_pen + 1) / 6
if not n_pen.is_integer():
continue
sqrt_tri = sqrt(1 + 8 * x) # all hexagonal numbers are also triangular
n_tri = (sqrt_tri - 1) / 2
print('T({}) = P({}) = H({}) = {}'.format(
int(n_tri), int(n_pen), int(n_hex), int(x)))
break
“投影Euler”0045三角形、五边形和六边形
三角形、五边形和六边形数字由
以下公式:
三角形T(n)=n(n+1)/21,3,6,10,15。。。
五边形P(n)=n(3n−1)/2 1, 5, 12, 22, 35, ...
六角H(n)=n(2n−1) 1, 6, 15, 28, 45, ...
可以验证T(285)=P(165)=H(143)=40755。
找到下一个三角形编号,它也是五边形和六边形。
答:T(55385)=P(31977)=H(27693)=1533776805
"""
从数学导入sqrt
_1_5 0=1@RBalasubramanian只是因为我必须将任意值传递给range,直到找到正确的答案。经过进一步思考-我不理解这个问题(尤其是itertools.count
如何工作)关于Euler 45项目已经有很好的文档,不需要检查三角形-每个六边形也都是三角形,索引2*n_hex-1
@MBo:Wow,我没有意识到!我会考虑到这一点来改进我的代码。谢谢