Prime Gap UVA - 1644

#include<bits/stdc++.h>
using namespace std;

#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)

const int maxn=1e7+10;
typedef long long ll;

bool pri[maxn];
int prime[maxn];
int cnt=0;
void init(){

	rep(i,2,maxn){
		if(!pri[i]){
			prime[cnt++]=i;
			for(ll j=1ll*i*i;j<maxn;j+=i){
				pri[j]=1;
			}
		}
	}
	//printf("cnt:%d\n",cnt);
}


/*
注意这个写法,大于等于,小于等于
*/
//找到第一个小于等于n的位置
int getpos1(int n){
    int l=0,r=cnt-1,mid,ans;
    while(l<=r){
        mid=(l+r)>>1;
        if(prime[mid]>n)
            r=mid-1;
        else{
            ans=mid;
            l=mid+1;
        }
    }
    return ans;
}
//找到第一个大于等于n的位置
int getpos2(int n){
    int l=0,r=cnt-1,mid,ans;
    while(l<=r){
        mid=(l+r)>>1;
        if(prime[mid]<n)
            l=mid+1;
        else{
            ans=mid;
            r=mid-1;
        }
    }
    return ans;
}

int main(){
    //double t1=clock();
	init();
    //printf("std:%.3f\n",(clock()-t1)/CLOCKS_PER_SEC);
    int n;
    while(scanf("%d",&n)==1&&n){
        int pos1=getpos1(n);
        int pos2=getpos2(n);
       // printf("pos:%d prime:%d\n",pos,prime[pos]);
        if(pos1==pos2){
            printf("0\n");
        }
        else{
            printf("%d\n",prime[pos2]-prime[pos1]);
        }
    }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/81193207
GAP
GAP