题意:给出[L,R]的区间,问这个区间内相邻素数的最大距离和最小距离
题解:小于2147483647的素数用到的小素数,只有sqrt(2147483,647)个,我们只要枚举这些素数,筛掉合数就可以得到这个区间的所有素数。
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000005
using namespace std;
bool f[N];
int b[N],top;
bool ff[N];
int main()
{
memset(f,true,sizeof(f));
f[0]=f[1]=false;
for(int i=2;i<N;i++)
{
if(f[i])
{
b[top++]=i;
for(int j=2;i*j<N;j++)
f[j*i]=false;
}
}
int l,r;
while(~scanf("%d%d",&l,&r))
{
memset(ff,true,sizeof(ff));
for(int i=0;i<top;i++)
for(int j=l/b[i];j<=r/b[i];j++)
if(j*b[i]>=l&&j*b[i]<=r&&j!=1)ff[j*b[i]-l]=false;
int last=0;
while((l+last<N&&!f[l+last])||(!ff[last]&&last<=r-l))last++;
int ma=0,mi=10000000;
int ma1=-1,ma2=-1,mi1=-1,mi2=-1;
for(int i=last+1;i<=r-l;i++)
{
if(ff[i])
{
if(l+i<N)if(!f[l+i])continue;
int len=i-last;
if(ma<len)
{
ma1=last;
ma2=i;
ma=len;
}
if(mi>len)
{
mi1=last;
mi2=i;
mi=len;
}
last=i;
}
}
if(ma1==-1)printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",mi1+l,mi2+l,ma1+l,ma2+l);
}
}