欧拉筛法打素数表,同时用ans[]
数组记录下两素数的间隔。
最终将v[],ans[]
都遍历一遍,时间复杂度O(n);
核心代码:
for(int k=p[np-1]+1;k<p[np];k++)
{
ans[k]= p[np]-p[np-1];
}
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e6+3e5;
int np=0,p[maxn],v[maxn],ans[maxn];
int gg(int n){
for(int i=2;i<=n;i++){
if(!v[i])
{
p[++np]=i;
for(int k=p[np-1]+1;k<p[np];k++)
{
ans[k]= p[np]-p[np-1];
}
}
for(int j=1;j<=np && i*p[j]<=n;j++){
v[i*p[j]]=1; //用这个合数的最小质因子去筛掉这个合数
if(i%p[j]==0) break;
}
}
return np;
}
int main(){
gg(maxn-10);
int n;
while (scanf("%d",&n)&& n) {
printf("%d\n",ans[n]);
}
return 0;
}