1. 问题描述:
2,3,5,7,11,13,....是素数序列。类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。 上边的数列公差为30,长度为6。 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少?
输出
输出一个整数表示答案
来源:http://oj.ecustacm.cn/problem.php?id=1326
2. 思路分析:
对于这种尝试性的题目,暴力就行。分析题目可以知道我们首先需要求解出足够多的素数,这样才可以尝试求解出长度为10的等差素数列。声明一个长度为10000的列表(如果计算不出结果那么长度可以小一点),在循环中判断当前遍历的数字是否是素数,如果是素数那么将当前的位置标记为1,标记素数的目的是为了能够通过下标对应的值判断出当前的数字是否素数,等差素数列需要首项和公差,所以需要使用两层循环表示首项和公差,然后在长度为小于10的循环中通过找出起始数字为j,公差为i的等差数列是否全部为素数,如果发现序列中有不是素数的情况那么直接break因为这个时候无法满足素数列的要求,最后判断长度是否等于10即可,答案是210
3. 代码如下:
def solve():
count = 0
# 标记出素数列表
n = 100000
primes = [0] * n
# 记录求解出的长度为10的等差素数列
res = [0] * 10
for i in range(2, n + 1):
j, f = 2, 1
# 判断当前的数字是否是素数
while j * j <= i:
if i % j == 0:
f = 0
break
j += 1
# 当前的数字为素数那么标记对应位置为1
if f == 1:
primes[i] = 1
# print(primes)
# 公差
for i in range(1, n + 1):
# 起始数字
for j in range(2, n + 1):
# 长度为10
count = 0
# 注意需要判断是否存在越界j + count * i < n
while count < 10 and j + count * i < n:
res[count] = j + count * i
if j + count * i < n and primes[j + count * i] == 0:
break
count += 1
if count == 10:
# 输出公差和首项
print(i, j)
return res
if __name__ == '__main__':
print(solve())