[蓝桥杯2017初赛]等差素数列

题目描述

2,3,5,7,11,13,....是素数序列。
类似: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;
}

猜你喜欢

转载自www.cnblogs.com/-citywall123/p/12331494.html
今日推荐