POJ 2689 Prime Distance

来源:互联网 发布:ben carson 知乎 编辑:程序博客网 时间:2024/05/16 16:21

素数的二次筛选。

素数的筛选,数据比较大,不能用常用的方法。因为最大数据是20亿,开根号后就为50000左右,把5万以下的素数表打出,再二次筛选就可以了。

开始的时候把函数写在外面超时,写进去以后就0ms过,这个想不通。。。

AC代码:

#include<iostream>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;int q[6008],q2[200000];bool w[50008],prime[1000008];int n,m,ant;int main(){    int i,j,sum;    int minn,minl,minr,maxx,maxl,maxr;    q[1]=2;    ant=2;    memset(w,0,sizeof(w));    for(i=3; i<=50000; i+=2)    {        if(w[i] == 0) q[ant++]=i;        for(j=1; j<ant && q[j]*i < 50000; j++)        {            w[i*q[j]] = 1;            if(!(i%q[j])) break;        }    }    //printf("ant = %d\n",ant);    while(~scanf("%d%d",&n,&m))    {        minn=99999999;        maxx=-99999999;        memset(prime,0,sizeof(prime));        for (i=1; i < ant; i++)          {            int s,t;            s=n/q[i];            t=m/q[i];            for (j=s; j<=t; j++)                if (j>1 && j*q[i] >= n) prime[j*q[i] - n]=1;        }        if(n == 1) prime[0]=1;        int ans=1;        for(i=0; i<=m-n; i++)        {            if(prime[i] == 0)            {                q2[ans++]=i+n;            }        }        if(ans <= 2)  printf("There are no adjacent primes.\n");        else        {            for(i=1; i<ans-1; i++)            {                if(q2[i+1]-q2[i] < minn)                {                    minn=q2[i+1]-q2[i];                    minl=q2[i];                    minr=q2[i+1];                }                if(q2[i+1]-q2[i] > maxx)                {                    maxx=q2[i+1]-q2[i];                    maxl=q2[i];                    maxr=q2[i+1];                }            }            printf("%d,%d are closest, %d,%d are most distant.\n",minl,minr,maxl,maxr);        }    }    return 0;}

路途中。。。。

原创粉丝点击