等差素数列

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了等差素数列相关的知识,希望对你有一定的参考价值。

标题:等差素数列 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;
}

以上是关于等差素数列的主要内容,如果未能解决你的问题,请参考以下文章

LQ0110 等差素数列无标题

蓝桥杯05

蓝桥杯最长等差素数数列

等差素数数列

python-趣味百题3

1751: n个素数构成等差数列