题目:https://projecteuler.net/problem=49
思路:题目数据范围不大,直接找出全部的4位数素数,以四位素数的最小permutation为key建立hash,再从中找出差为3330的等差数列即可
def findArithmeticProgression(arr, dif):
for x in arr:
if x + dif in arr and x + dif + dif in arr:
return [x, x + dif, x + dif + dif]
return None
N = 10000
#1. figure out all prime numbers of 4 digits
notPrime = [False] * N
for i in range(2, N):
if not notPrime[i]:
for j in range(i+i, N, i):
notPrime[j] = True
#2. for those 4-digits primes, build hash with there minimum permutations
table = {}
for i in range(1000, N):
if notPrime[i]:
continue
s = ''.join(sorted(str(i)))
if s not in table:
table[s] = [i]
else:
table[s].append(i)
#3. find targets, that are 3330 arithmetic progression
for _, v in table.items():
if len(v) >= 3:
seq = findArithmeticProgression(v, 3330)
if seq:
print(seq)