您的位置:首页 > 其它

POJ 2689 Prime Distance [素数筛+想法]

2017-08-24 20:30 381 查看
题意:给出[L,R]的区间,问这个区间内相邻素数的最大距离和最小距离

题解:小于2147483647的素数用到的小素数,只有sqrt(2147483,647)个,我们只要枚举这些素数,筛掉合数就可以得到这个区间的所有素数。

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000005
using namespace std;
bool f
;
int b
,top;
bool ff
;
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: