sicily 1500. Prime Gap

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 1299800
int isPrime[maxn],prime[100020],cnt;
void make_prime() //线性筛素数
{
fill(isPrime,isPrime+maxn,1);
cnt=0;
for(int i=2;i<=maxn;++i)
{
if(isPrime[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]*i<maxn;++j)
{
isPrime[prime[j]*i]=0;
if(i%prime[j]==0)
break;
}
}
}
int find(int num) //如果是素数,返回-1;否则返回下标s:使得prime[s]刚好是大于num的第一个数,即prime[s]<num<prime[s+1]
{
int s=0,t=cnt,m;
while(s<t)
{
m=s+(t-s)/2;
if(prime[m]==num)
return -1;
else if(prime[m]<num)
s=m+1;
else
t=m;
}
return s;
}
int main()
{
make_prime();
int n;
while(scanf("%d",&n)&&n)
{
int id=find(n),res=0;
if(n>1&&id!=-1) //处理n=1的情况
res=prime[id]-prime[id-1]; //prime[id-1]<n<prime[id]
printf("%d\n",res);
}
return 0;
}

posted on 2012-03-03 01:29  sysu_mjc  阅读(219)  评论(0编辑  收藏  举报

导航