等差素数列
问题描述:
2,3,5,7,11,13,…是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
思路:
使用埃式筛选法,假设1----1000001都是素数 然后进行线性素数筛选(欧式当然就更优了,但这里埃筛就已经够用了,埃筛也比较好写
(^ _ ^)
code:
#include<stdio.h>
#include<string.h>
int isPrime[1000001];
int Prime[999999]={
0};
int main(){
int len=0;
for(int i=0;i<1000001;i++){
isPrime[i]=1;
}
isPrime[0]=0;
isPrime[1]=0;
isPrime[2]=1;
for(int i=2;i<1000001;i++){
if(isPrime[i]==1){
Prime[len++]=i;
for(int j=2*i;j<1000001;j+=i){
isPrime[j]=0;
}
}else{
continue;
}
}
int ans=0;
for(int k=5;k<=1000;k++){
//这里假设最小公差不超过1000,也可以直接while(1),找到直接后输出再return 0;
for(int i=0;i<len-10;i++){
int cnt=0;
for(int p=0;p<10&&Prime[i]+p*k<100001;p++){
if(isPrime[Prime[i]+p*k])cnt++;
}
if(cnt==10){
printf("%d",k);
return 0;
}
}
}
return 0;
}
最终答案:
210