二分答案要求被分的是排序后的。不断接近答案,判断是否符合条件,这里的条件是p[mid]和n接近n
拿它当二分答案入门...虽然被坑了好长时间(就是素数筛选法,用i*i<=NMAX半就停止会WA)
求指定数左右两边的第一个素数之差
#define NMAX 1299800
#include <stdio.h>
#include <math.h>
#include <string.h>
int p[NMAX];
char prime[NMAX];
int n,index;
int l,r;
int ans;
void getPrime(){
int i,j;
memset(prime,0,sizeof(prime));
index = 0;
prime[0] = prime[1] = 1;
for(i=2;i<=NMAX;i++){ //这里千万不能是i*i<=NMAX
if(!prime[i]){
p[index++] = i;
for(j=2*i;j<=NMAX;j+=i)
prime[j] = 1;
}
}
}
void Bound_search()
{
int mid;
while(l < r)
{
mid = (l + r)/2;
if(p[mid] > n) r = mid;
else l = mid + 1,ans = mid;
}
}
int main()
{
int i; //freopen("in.txt","r",stdin);
getPrime();
while(scanf("%d",&n)!=EOF,n)
{
if(!prime[n])
printf("0\n");
else{
l = 0;
r = index;
Bound_search();
printf("%d\n",p[ans+1]-p[ans]);
}
}
return 0;
}