[蓝桥杯2017初赛]等差素数列
- Description
2,3,5,7,11,13,…是素数序列。
类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。
上边的数列公差为30,长度为6。
2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。
这是数论领域一项惊人的成果!
有这一理论为基础,请你借助手中的计算机,满怀信心地搜索:
长度为10的等差素数列,其公差最小值是多少?
-
Input
无
-
Output
输出一个整数代表答案。
分析
素数筛:
int su[20000]={0}; //存取素数
int shai[20000]={1,1,0}; //质数标记为0,非质数标记为1 。0,1,2分别对应1,1,0
void init()
{
int k=0;
for(int i=0;i<10000;i++)
{
if(shai[i]) //如果i不为素数,退出
continue;
for(int j=i;j*i<10000;j++) //质数打表,质数为0,不是质数为1
{
shai[i*j]=1;
}
su[k++]=i;
}
}
- AC代码
#include<bits/stdc++.h>
using namespace std;
int su[20000]={0};
int shai[20000]={1,1,0};
void init()
{
int k=0;
for(int i=0;i<10000;i++)
{
if(shai[i])
{
continue;
}
for(int j=i;j*i<10000;j++) //质数打表,质数为0,不是质数为1
{
shai[i*j]=1;
}
su[k++]=i;
}
}
int solve()
{
int i,j,k;
for(i=0;i<10000;i++)
{
int kk=su[i]; //当前质数
for(k=1;k<1000;k++) //模拟公差
{
for(j=1;j<10;j++)
{
if(shai[kk+j*k])//如果10个数中任意一个数不为质数,退出
{
break;
}
}
if(j>=10) //找到答案
{
return k;
}
}
}
}
int main()
{
init();
int a=solve();
cout<<a;
return 0;
}