Python编程之欧拉计划49~50
欧拉计划
欧拉计划(Project Euler)。
49、找出由互为排列的4位数质数组成的序列
1487, 4817, 8147 这个序列,每个比前一个递增 3330,而且这个序列有两个特点:1. 序列中的每个数都是质数。 2. 每个四位数都是其他数字的一种排列。
1,2,3 位组成的三个质数的序列中没有具有以上性质的。但是还有另外一个四位的递增序列满足这个性质。
如果将这另外一个序列的三个数连接起来,组成的 12 位数字是多少?
def get_primes(n):
primes = [True] * n
primes[0] = primes[1] = False
primes[4: n: 2] = [False] * len(primes[4: n: 2])
for i in range(3, int(n ** 0.5) + 1, 2):
if primes[i]:
primes[i * i: n: i] = [False] * len(primes[i * i: n: i])
return [k for k, p in enumerate(primes) if p and k > 1000]
prime_list = get_primes(10000)
for i in prime_list:
i3, i6 = i + 3330, i + 6660
if i3 in prime_list and i6 in prime_list:
if sorted(list(str(i))) == sorted(list(str(i3))) == sorted(list(str(i6))):
print(i, i3, i6)
输出:
1487 4817 8147
2969 6299 9629
50、100万以下的哪个质数能够写成最多连续质数的和
41 这个质数,可以写作 6 个连续质数之和:
41 = 2 + 3 + 5 + 7 + 11 + 13
这是 100 以下的最长的和为质数的连续质数序列。
1000 以下最长的和为质数的连续质数序列包含 21 个项,和为 953。
找出 100 万以下的最长的何为质数的连续质数序列之和。
100 万以下的哪个质数能够写成最长的连续质数序列?
def get_primes(n):
primes = [True] * n
primes[0] = primes[1] = False
primes[4: n: 2] = [False] * len(primes[4: n: 2])
for i in range(3, int(n ** 0.5) + 1, 2):
if primes[i]:
primes[i * i: n: i] = [False] * len(primes[i * i: n: i])
return [k for k, p in enumerate(primes) if p]
N=1000000
primes = get_primes(N)
mini_list = [x for x in primes if x < N//200]
for lenth in range(len(mini_list), 5, -1):
for i in range(0, len(mini_list) - lenth + 1):
# 取出长度为lenth的连续质数累加求和
tmp = sum(mini_list[i:i + lenth])
if tmp > N:
break
elif tmp in primes:
print(f'{tmp}是{lenth}个连续质数之和')
exit()
输出:
997651是543个连续质数之和