我正在尝试从状态Euler(https://projecteuler.net/problem=44)解决问题44,该问题
五边形数由公式Pn = n(3n-1)/ 2生成。前十个五边形数字是:
1、5、12、22、35、51、70、92、117、145,...
可以看出P4 + P7 = 22 + 70 = 92 = P8。但是,它们之间的差异70 − 22 = 48并不是五边形。
找到一对五边形数Pj和Pk,它们的和与差为五角形,并且D = | Pk − Pj |最小化; D的值是什么?
这是我的方法,但是执行时间太长。我花了15分钟以上才杀死了它。由于我不知道答案,因此这是一种点击尝试方法,在此方法中,我会检查每个低于10000的数字。
pentagonal = []
for i in range (1,10001):
x = (i*(3*i - 1))/2
pentagonal.append(x)
for i in pentagonal:
for j in pentagonal:
x = i - j
y = i + j
if x in pentagonal and y in pentagonal:
print("(",i,":",j,")")
答案 0 :(得分:0)
使用 in 命令搜索大列表效率不高。最好的方法是使用bisect模块。
from bisect import bisect_left
pentagonal = []
for n in range(1, 10000):
p = int((n*(3*n - 1))/2)
pentagonal.append(p)
def bisect_search(lst, item):
''' it is used for sorted lists'''
return (item <= lst[-1]) and (lst[bisect_left(lst, item)] == item)
for i in pentagonal:
for j in pentagonal:
diff = abs(i - j)
sam = i + j
if bisect_search(pentagonal, sam) and bisect_search(pentagonal, diff):
print("(", i, ":", j, ")")
最小差异来自Pk = 7042750和Pj = 1560090,D = 5482600