先用筛法找出所1000到10000之间的素数,以其中每个数重排后所得的最小数字为键值整理该素数表得一字典。
遍历该字典,对其中长度不小于3的项,检查其所有三元子集能否构成等差数列,除题面中的数列外,只有2969、6299、9629能符合要求(其公差也是3330),因此结果是$296962999629$。
import itertools
target=10000
d=[0]*target
n=2
while n < target:
for i in range(n+n,target,n):
d[i]=d[i]+1
n=n+1
while n < target and d[n]>0:
n=n+1
primeList=[k for k in range(1000,target) if d[k]==0]
primeDict={}
for p in primeList:
q=int("".join(sorted(list(str(p)))))
if q in primeDict:
primeDict[q].append(p)
else:
primeDict[q]=[p]
print [[i,j,k] for q in primeDict for i,j,k in itertools.combinations(primeDict[q],3) if (6*min(i,j,k)+3*(max(i,j,k)-min(i,j,k)))==(i+j+k)*2]
|