给出一个数字n,求n所在得一个区间的长度,区间是最近的两个素数为边界;
那么n如果为素数的话,那么直接输出0;
先打表,因为用的是前10万个素数,所以在打表的时候,记录素数的个数;
以n点为中心向两边判定,一定要先判定再加减;
#include<iostream>
#include<cstring>
#include<cmath>
#define ll long long
#define MAXN 10000005
#define maxn 100005
using namespace std;
bool isprime[MAXN];
ll num = 0;
void checkprime() {
memset(isprime, true, sizeof(isprime));
num++;//因为2也是素数
for(ll i = 2; num <= maxn; i++) {
if(isprime[i]) {
num++;//如果没有标记的话就是素数,标记个数
for(ll j=i+i; j <= MAXN; j+=i) {//以i为倍数的数都是偶数,都不是素数,全部筛除
isprime[j] = false;
}
}
}
}
int main () {
int n;
checkprime();
while(cin >> n && n) {
int ans = 1;
if(isprime[n]) puts("0");
else {
int l = n-1, r = n;//预处理向左
while(!isprime[l]) {//向左
l--;
++ans;
}
while(!isprime[r]) {//向右
r++;
++ans;
}
printf("%d\n", ans);
}
}
return 0;
}