POJ2689

来源:互联网 发布:java jackson 编辑:程序博客网 时间:2024/06/05 23:23
题目连接:http://poj.org/problem?id=2689转载请注明出处:http://hi.baidu.com/pub/show/createtext题意:求某个区间内素数最近距离和素数最远距离思路:二次筛选法开始根据素数定理可知在最大范围的素数分布在50000的区间内,我们可以求出在这范围内的素数,这是第一次筛选void doprime1(){    numprime1=0;    memset(isprime,true,sizeof(isprime));    isprime[1]=false;    for(long long i=2; i<maxn; i++)    {        if(isprime[i])        {            prime1[++numprime1]=i;            for(long long j=i*i; j<maxn; j+=i)            {                isprime[j]=false;            }        }    }}由于数据较大  我们必须在[l,u]之间在把这个区间的素数筛选出来,通过开始的素数表吧[l,u]的非素数排除掉void doprime2(){    long long b;    long long j;    memset(isprime,true,sizeof(isprime));    for(int i=1; i<=numprime1; i++)    {        b=l/prime1[i];        while(b*prime1[i]<l||b<=1)            b++;        for(j=b*prime1[i]; j<=u; j+=prime1[i])        {            if(j>=l)            {                isprime[j-l]=false;            }        }    }    if(l==1)    {        isprime[0]=0;    }AC Code#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#include<climits>using namespace std;const int maxn=50000;const int maxm=99999999;bool isprime[maxn*20];int prime1[maxn];int numprime1;void doprime1(){    numprime1=0;    memset(isprime,true,sizeof(isprime));    isprime[1]=false;    for(long long i=2; i<maxn; i++)    {        if(isprime[i])        {            prime1[++numprime1]=i;            for(long long j=i*i; j<maxn; j+=i)            {                isprime[j]=false;            }        }    }}long long l,u;long long prime2[1000001];int numprime2;void doprime2(){    long long b;    long long j;    memset(isprime,true,sizeof(isprime));    for(int i=1; i<=numprime1; i++)    {        b=l/prime1[i];        while(b*prime1[i]<l||b<=1)            b++;        for(j=b*prime1[i]; j<=u; j+=prime1[i])        {            if(j>=l)            {                isprime[j-l]=false;            }        }    }    if(l==1)    {        isprime[0]=0;    }}void solve(){    long long minr,minl,maxr,maxl;    long long mmin=maxm,mmax=0;    doprime2();    numprime2=0;    for(int i=0; i<=u-l; i++)    {        if(isprime[i])        {            prime2[++numprime2]=i+l;        }    }    if(numprime2<=1)cout<<"There are no adjacent primes."<<endl;    else    {        for(int i=1; i<numprime2; i++)        {            if(prime2[i+1]-prime2[i]>mmax)            {                mmax=prime2[i+1]-prime2[i];                maxl=prime2[i];                maxr=prime2[i+1];            }            if(prime2[i+1]-prime2[i]<mmin)            {                mmin=prime2[i+1]-prime2[i];                minl=prime2[i];                minr=prime2[i+1];            }        }        cout<<minl<<","<<minr<<" are closest, "<<maxl<<","<<maxr<<" are most distant."<<endl;    }}int main(){    doprime1();    while(cin>>l>>u)    {        solve();    }    return 0;}

原创粉丝点击