五角数通过如下公式定义: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的值是多少?
import time
def is_pn(p):
""" 是否五角数 """
n = (1 + pow(1 + 24 * p, 0.5)) / 6
if int(n) == n:
return True
else:
return False
# n越大,D = |Pk − Pj|越大
t0 = time.time()
Pn = lambda n: n * (3 * n - 1) / 2
i_pk = 1
flag = True
while flag:
i_pk += 1
pk = Pn(i_pk)
for i_pj in range(1, i_pk):
pj = Pn(i_pj)
if is_pn(pk - pj):
if is_pn(pk + pj):
flag = False
break
print(pk - pj)
t1 = time.time()
print(t1 - t0)