等差素数数列
问题描述
类似7,37,67,97 和 107,137,167,197,这样有素数组成的数列叫做等差素数数列。素数数列具有项数的限制,一般指素数数列的项数有多少个连续项,最多可以存在多少个连续项。
编程找出100以内的等差素数数列。
算法思路
- 使用筛法找出100内的素数,存在素数表prime中
- 在prime中找出任意两数构成素数等差数列的a0,a1
- 计算出a2,判断其是否为素数,如果是则加入素数等差数列的列表s中
代码示例
Python
pt = [True] * 1000 # 筛表
def isPrime(n):
if pt[n]:
for x in range(n ** 2, len(pt), n):
pt[x] = False
return True
else:
return False
# 1. 构建素数表
prime = [] # 素数表
for x in range(2, 101):
if isPrime(x):
prime.append(x)
# print(prime)
# 2. 任取prime中的两个数作为a0,a1
for i in range(len(prime)):
for j in range(i + 1, len(prime)):
a0, a1 = prime[i], prime[j]
d = a1 - a0 # 公差
an = a1 + d
s = [] # 用来存放等差素数数列
while an < 100 and isPrime(an):
s.append(an)
an += d
if s:
print([a0,a1]+s)
Java
import java.util.ArrayList;
import java.util.List;
public class 等差素数数列 {
static boolean[] pt;
static boolean isPrime(int n) {
if (pt[n]) {
for (int i = n * n; i < pt.length; i += n) {
pt[i] = false;
}
return true;
} else {
return false;
}
}
static void init() {
pt = new boolean[1000];
for (int i = 0; i < pt.length; i++) {
pt[i] = true;
}
}
public static void main(String[] args) {
init();
List<Integer> prime = new ArrayList<>();
for (int i = 2; i < 101; i++) {
if (isPrime(i)) {
prime.add(i);
}
}
for (int i = 0; i < prime.size(); i++) {
for (int j = i + 1; j < prime.size(); j++) {
List<Integer> s = new ArrayList<>(); // s用来存放等差数列
int a0 = prime.get(i);
int a1 = prime.get(j);
s.add(a0);
s.add(a1);
int d = a1 - a0; // 公差
int an = a1 + d;
while (an < 100 && isPrime(an)) {
s.add(an);
an += d;
}
if (s.size() > 2) {
System.out.println(s);
}
}
}
}
}