2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
答案:210
思路:
1,首先从小到大枚举素数表;
2,在素数表中,寻找长度为10的等差数列,如果找到,则返回公差
参考代码:
using namespace std;
typedef long long LL;
set<int> all;
bool isPrimt(LL t){//判断是否是素数
for (int i = 2; i < t/2; ++i) {
if(t % i == 0) return false;
}
return true;
}
int f(LL a[], int n){//寻找长度为10的等差素数列
for (int i = 0; i < n; ++i) {//枚举首项
LL first = a[i];
for (int delta = 1; delta < a[n -1] - first; ++delta) {//枚举公差
int m = first;
for (int j = 1; j < 10; ++j) {//枚举个数
m += delta;
if(all.find(m) == all.end()) break;//m不是素数
if(m > a[ n - 1]) break;
if(j == 9)//已经找了10项
return delta;
}
}
}
return -1;
}
const int N = 5000;
int main(){
LL a[N];
a[0] = 2;
a[1] = 3;
all.insert(2);
all.insert(3);
int index = 2;
LL t = 5;
while(index < N){//枚举5000位素数表
if(isPrimt(t)){
a[index++] = t;
all.insert(t);
}
t++;
}
printf("%d\n", f(a,N));
return 0;
}