POJ2689

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=1000006;
bool ha[maxn]={false};
int prime[maxn];
int cnt=0;
void Prime(void)
{
    ha[1]=true;
    for(int i=2;i<maxn;i++)
    {
        if(!ha[i]) prime[cnt++]=i;
        for(int j=0;j<cnt&&prime[j]<=maxn/i;j++)
        {
            ha[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
    return ;
}

int prime2[maxn];
int cnt2;
int l,r;
bool haa[maxn];
void _ha(void)
{
    memset(haa,0,sizeof(haa));
    int rr=sqrt(r*1.0);
    if(l<2) l=2;//1不是素数
    cnt2=0;
    for(int i=0;i<cnt&&prime[i]<=rr;i++)
    {
        int z=l/prime[i]+(l%prime[i]!=0);
        if(z==1) z++;//本身是素数
        for(int j=z;(ll)j*prime[i]<=r;j++)
            if(j*prime[i]>=l) haa[j*prime[i]-l]=true;
    }

    for(int i=0;i<=r-l;i++)
    {
        if(haa[i]==false)
        {
            prime2[cnt2++]=i+l;
            //printf("Prime2: %d\n",i+l);
        }

    }
    return ;
}

int main(void)
{
    Prime();
    while(scanf("%d%d",&l,&r)!=EOF)
    {
        _ha();
        if(cnt2<2)
        {
            printf("There are no adjacent primes.\n");
            continue;
        }
        int a1,a2,b1,b2;
        int minn=10000000;
        int maxn=0;
        for(int i=1;i<cnt2;i++)
        {
            if(prime2[i]-prime2[i-1]>maxn)
            {
                maxn=prime2[i]-prime2[i-1];
                a1=prime2[i],a2=prime2[i-1];
            }

            if(prime2[i]-prime2[i-1]<minn)
            {
                minn=prime2[i]-prime2[i-1];
                b1=prime2[i],b2=prime2[i-1];
            }
        }

        printf("%d,%d are closest, %d,%d are most distant.\n",b2,b1,a2,a1);
    }
    return 0;
}