[蓝桥杯2017初赛]等差素数列
题目描述
2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
输出
输出一个整数表示答案
答案:210
题解:先素数打表,然后枚举公差和首项,条件判断又十个等差数列就可以
#include<iostream> #include<queue> #include<algorithm> #include<set> #include<string.h> #define mx 1000000 using namespace std; int prim[mx],a[mx]; int t=0; void init()//素数打表 { memset(prim,0,sizeof(prim)); prim[1]=1; for(int i=2;i<mx;i++) { if(prim[i])//是偶数 continue; for(int j=i<<1;j<mx;j=j+i)//把素数的倍数标记 prim[j]=1; } for(int i=2;i<=mx;i++)//保存素数 if(prim[i]==0) a[t++]=i; } int main() { init(); int flag=0; //cout<<t<<endl; for(int d=1;d<10000;d++) { for(int i=0;i<t;i++) { int cnt=1; for(int j=1;j<=9;j++) { int x=a[i]+j*d; if(prim[x]==0) cnt++; else break; } if(cnt==10) { cout<<d<<endl; flag=1; break; } } if(flag==1) break; } return 0; }
等风起的那一天,我已准备好一切