第八届蓝桥杯省赛第二题---等差素数列

标题:等差素数列

2,3,5,7,11,13,....是素数序列。
类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。

2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!

有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:

长度为10的等差素数列,其公差最小值是多少?

注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字。

分析:这道题目思路挺简单的,就是用线性筛选法把10^6内的素数筛选出来,然后从大到小枚举然后去验证

关键是一定要掌握线性筛选法。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define ll long long
 5 const int maxn=1e6;
 6 int check[maxn]={0};
 7 int prime[maxn];
 8 int pos;
 9 
10 void init(){//线性筛选法
11     for( ll i=2; i<maxn; i++ ){
12         if(!check[i]){
13             prime[pos++]=i;
14         }
15         for( ll j=0; j<pos&&i*prime[j]<maxn; j++ ){
16             check[i*prime[j]]=1;
17             if(i%prime[j]==0) break;
18         }
19     }
20 }
21 
22 int main(){
23     init();
24     for(int k=1; k*10<maxn; k++ ){//k为公差
25         for( int i=0; i<pos; i++ ){
26             int flag=1,temp=prime[i];
27             for( int j=1; j<10; j++ ){
28                 if(temp+k>=maxn||check[temp+k]==1){
29                     flag=0;
30                     break;
31                 }
32                 else{
33                     temp+=k;
34                 }
35             }
36             if(flag==1){
37                 cout<<k<<" "<<prime[i]<<endl;
38             }
39         }
40     }
41 
42     return 0;
43 }
44 //210 199
有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
原文地址:https://www.cnblogs.com/Bravewtz/p/10344482.html