poj2689

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=1000000;

long long v[maxn],prime[maxn];
bool ans[1000000+10];
long long ans2[1000000+10];

int main(){
    int l,r;
    while(scanf("%d%d",&l,&r)!=EOF){
    memset(ans,0,sizeof(ans));
    memset(ans2,0,sizeof(ans2));
    memset(prime,0,sizeof(prime));
    memset(v,0,sizeof(v));
    int n;
    n=sqrt(r)+100;
    int top=0;
    for (int i=2;i<=n;i++){
        if(v[i]==0){
            prime[++top]=i;
            v[i]=i;
        }
        for (int j=1;j<=top;j++){
            if(prime[j]>v[i]||prime[j]>n/i) break;
            v[i*prime[j]]=prime[j];
        }
    }
    for (int i=1;i<=top;i++){
        for (int j=ceil(double(l)/double(prime[i]))>1?ceil(double(l)/double(prime[i])):2;j*prime[i]<=r;j++){
            ans[prime[i]*j-l]=1;
        }
    }
    int m=0;
    for (int i=0;i<=r-l;i++){
        if(!ans[i]) {
                ans2[++m]=i;
        }
    }
    if(m<=1) {
            printf("There are no adjacent primes.\n");
            continue;
    }

    long long maxl,maxr,maxans=0;
    long long minl,minr,minans=10000000;
    for (int i=1;i<m;i++){
        if(ans2[i+1]-ans2[i]>=maxans){
            maxl=ans2[i];
            maxr=ans2[i+1];
            maxans=ans2[i+1]-ans2[i];
        }
        if(ans2[i+1]-ans2[i]<=minans){
            minl=ans2[i];
            minr=ans2[i+1];
            minans=ans2[i+1]-ans2[i];
        }
    }
    printf("%lld,%lld are closest, %lld,%lld are most distant.\n",minl+l,minr+l,maxl+l,maxr+l);
 }
return 0;
}

 

posted @ 2018-05-08 19:40  lmjer  阅读(103)  评论(0编辑  收藏  举报