素数筛 poj 2689

素数筛 

#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;
#define MAXN 47000
#define inf  100000000

bool z[MAXN];
int  x[MAXN];
bool y[1001000];
int x1[1001010];

int main()
{
    int a,b;
    for(int i=2;i<=220;i++) //可以从小的素数开始筛 
    {
        if(!z[i])
            for(int j=i*i;j<MAXN;j+=i)
                z[j]=1;
    }
    int cnt=0;
    for(int i=2;i<MAXN;i++) //这个范围可以筛出2147483647
        if(!z[i])
            x[cnt++]=i;
    while(scanf("%d%d",&a,&b)!=EOF)
    {
        int m1=inf,m2=-1;
        int en=b-a;
        memset(y,0,sizeof(y));
        if(a==1)
            a++;

        for(int i=0;i<cnt;i++)  //b-a<=1000000  从a开始筛
        {
            int a1,b1;
            a1=(a-1)/x[i]+1;
            b1=b/x[i];
            for(int j=a1;j<=b1;j++)
                if(j>1)
                    y[j*x[i]-a]=1;
        }

        int cnt1=0;

        for(int i=0;i<=b-a;i++)
            if(!y[i])
            {
                x1[cnt1++]=i+a;
            }

        int i=0,j=cnt1-1;
        while(x1[i]<a)
            i++;
        while(x1[j]>b&&j>=0)
            j--;
        int l1,r1,l2,r2;

        for(int k=i;k+1<=j;k++)
        {
            if(x1[k+1]-x1[k]>m2)
            {
                m2=x1[k+1]-x1[k];
                r2=x1[k+1];
                l2=x1[k];
            }
            if(x1[k+1]-x1[k]<m1)
            {
                m1=x1[k+1]-x1[k];
                r1=x1[k+1];
                l1=x1[k];
            }
        }
        if(m2==-1)
            printf("There are no adjacent primes.\n");
        else
            printf("%d,%d are closest, %d,%d are most distant.\n",l1,r1,l2,r2);
    }
    return 0;
}

 

posted on 2016-12-14 18:30  HelloWorld!--By-MJY  阅读(157)  评论(0编辑  收藏  举报

导航