您的位置:首页 > 其它

uva 10140 素数筛选(两次)

2013-07-29 15:14 369 查看
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;

bool flag[50010];
int prime[8000];
bool r[1000010];
int num;
void Init()
{
int i,j;
num=0;
memset(flag,true,sizeof(flag));
flag[1]=flag[0]=0;
for(i=2;i<50000;i++)
{
if(flag[i]) prime[num++]=i;
for(j=0;j<num && i*prime[j]<50000;j++)
{
flag[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
}

int main()
{
Init();
long long a,b,up,mina,minb,maxa,maxb,min,max,i,j,k;
while(cin>>a>>b)
{
if(a==1) a++;//a=1的情况
min=20000000;
max=0;
memset(r,true,sizeof(r));
for(i=0;i<num && prime[i]*prime[i]<=b;i++)
{
k=a/prime[i];
if(k*prime[i]<a) k++;
if(k<=1) k++;
while(k*prime[i]<=b)
{
r[k*prime[i]-a]=false;
k++;
}
}
j=0;up=-1;
for(i=0;i<=b-a;i++)
{
if(r[i])
{
if(up==-1) up=i;
else
{
if(min>i-up)
{
min=i-up;
mina=up;
minb=i;
}
if(max<i-up)
{
max=i-up;
maxa=up;
maxb=i;
}
up=i;
}
}
}
if(max==0) printf("There are no adjacent primes.\n");
else printf("%lld,%lld are closest, %lld,%lld are most distant.\n",mina+a,minb+a,maxa+a,maxb+a);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: