等差素数数列
问题描述
类似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); } } } } }