这道题目一开始做感觉挺难的,老是超过时间限制,后来用素数表+二分法过
#include<stdio.h>
#include<cstring>
using namespace std;
#define MAXN 1299800
int arr[MAXN],a[MAXN];
int tot = 0;
void init(){
memset(arr , 0 ,sizeof(arr));
a[1] = 1;
for(int i = 2 ; i <= MAXN ; i++){
if(arr[i] == 0){
a[++tot] = i;//存储素数
for(int j = i ; j <= MAXN ; j += i){
arr[j] = i; //子素数,素数表
}
}
}
}
int ff(int left ,int n , int right){ //二分法
int temp,mid;
while(left <= right){
mid = (left + right) / 2;
if(a[mid] < n){
left = mid + 1;
}
else if(a[mid] > n)
right = mid - 1;
else
return mid;
}
//printf("%d\n",temp);
//return temp;
}
int main(){
int n,t;
init();//一开始把素数表弄出来先,如果放在while里面的话,每一次输入数组都会运行一遍init,这会大大增加时间复杂度
while(~scanf("%d",&n)){
if(n == 0)
break;
t = ff(0 , n , tot);
if(arr[n] == 0)
printf("0\n");
else
printf("%d\n",a[t] - a[t - 1]);
}
return 0;
}