利用打表法,求出对应范围内的所有的素数,然后首先判断当前输入的数是否是素数,如果是素数,那么就直接输出0,如果不是,那么就向前找以及向后找,计算最终的结果即可。题目的关键在于打表,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;
int data;
const int maxn = 1299711;
int vis[maxn+5];
void Init(){
int m = floor(sqrt(maxn) + 0.5);
memset(vis,0,sizeof(vis));
for (long long i = 2; i <= m; i++){
if (!vis[i]){
for (long long j = i*i; j <= maxn; j += i)
vis[j] = 1;
}
}
}
int main(){
Init();
while (cin >> data){
if (data == 0) break;
if (!vis[data]) cout << "0\n";
else{
int i = data;
while (vis[i] != 0) i--;
int j = data;
while (vis[j] != 0) j++;
cout << (j - i) << endl;
}
}
return 0;
}