题目描述
2,3,5,7,11,13,… 是素数序列。 类似:7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为 3030,长度为 66。
20042004 年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为 1010 的等差素数列,其公差最小值是多少?
解题思路:
直接用暴力法,列举出1e8以内的素数,然后再从公差为1开始搜寻是否存在公差d的长度最少为10的数列。
public static void main(String[] args) {
int length = 10000000,c = 1000;
//记录1e8以内的数有哪些是素数
boolean dp[] = new boolean[length];
//初始化数组
Arrays.fill(dp,true);
//搜索素数
for(int i = 2;i*i< length;i++) {
for(int j = i*i;j < length;j+=i)
dp[j] = false;
}
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 2;i*i < length;i++) {
if(dp[i])
list.add(i);
}
//创建数组记录构成相应等比数列的元素
int arr[][] = new int[list.size()][c];
for(int i = 0;i < list.size();i++) {
Integer item = list.get(i);
for(int j = 1;j < c;j++) {
if(list.contains(item-j))
arr[i][j] = arr[list.indexOf(item-j)][j]+1;
//当记录到9时说明此等差数列的长度已经到达10了
if(arr[i][j] == 9) {
System.out.println(j);
return ;
}
}
}
}