五角数字代码执行时间太长

时间:2019-01-27 06:14:22

标签: python numbers

我正在尝试从状态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,")")

1 个答案:

答案 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