标题:等差素数列 2,3,5,7,11,13,....是素数序列。 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。 上边的数列公差为30,长度为6。 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。
#include <iostream>
#include <cstring>
using namespace std;
const long long Max=1000000;
bool check[Max];
int prime[Max];
int pos=0;
bool is_Prime()
{
memset(prime,0,sizeof(prime));//存放1000000以内素数
memset(check,true,sizeof(check));//true是素数,false不是素数
for(int i=2;i<=Max;i++)
{
if(check[i])//如果是素数,则把这个数存入到prime数组中,prime中的素数是按升序排列的
prime[pos++]=i;
for(int j=0;j<pos&&i*prime[j]<Max;j++)//线性素数筛选法 参考 http://www.cnblogs.com/tianzeng/p/8681864.html
{
check[i*prime[j]]=false;
if(!(i%prime[j]))
break;
}
}
//cout<<pos<<endl;
}
void search()
{
for(int d=1;d<=1000;d++)//公差
for(int j=0;j<pos;j++)//遍历prime中的数,
{
bool flag=true;
int temp=prime[j];
for(int count=1;count<10;count++)//要求长度为十,所以需要比较十次
{
if(temp+d>Max||(!check[temp+d]))//如果当前的数+d>Max,或不是素数,退出,一下一个素数为起点寻找
{
flag=false;
break;
}
else
temp+=d;//不断更新temp(a2=a1+d,d3=a2+d,d4=a3+d...如此)
}
if(flag)
{
cout<<d<<" "<<prime[j]<<endl;
return ;
}
}
}
int main()
{
is_Prime();
search();
return 0;
}