欧式筛法;
//#include<bits/stdc++.h>
#include<iostream>运用欧式筛时数组一定要开的够大;;;;;;
#include<cstdio>
using namespace std;
bool flag[5000000];//0为素数,1为非素数;
int prime[5000000];//储存素数的地方;
int s,n=1000000,t;
int d[5000000],q;
int main(){
cin>>t;
for(int i=2;i<=n;i++){//从i=2开始遍历;寻找素数;并把素数储存到数组中;
if(flag[i]==0)prime[++s]=i;
for(int j=1;j<=s&&i*prime[j]<=n;j++){
flag[prime[j]*i]=1;//标记最小质因子;
if(i%prime[j]==0){//i是其整数倍;不是最小质因子直接跳过;
break;
}
}
}
上例题;19年ACM入队赛F题
//#include<bits/stdc++.h>
#include<iostream>运用欧式筛时数组一定要开的够大;;;;;;
#include<cstdio>
using namespace std;
bool flag[5000000];//0为素数,1为非素数;
int prime[5000000];//储存素数的地方;
int s,n=1000000,t;
int d[5000000],q;
int main(){
cin>>t;
for(int i=2;i<=n;i++){//从i=2开始遍历;寻找素数;并把素数储存到数组中;
if(flag[i]==0)prime[++s]=i;
for(int j=1;j<=s&&i*prime[j]<=n;j++){
flag[prime[j]*i]=1;//标记最小质因子;
if(i%prime[j]==0){//i是其整数倍;不是最小质因子直接跳过;
break;
}
}
}
for(int i=0;i<t;i++){
cin>>q;
for(int j=1;j<=s;j++){
if(q==prime[j]){
d[i]=0;
}else if(q<prime[j+1]&&q>prime[j]){
d[i]=prime[j+1]-prime[j];
}
}
}
for(int i=0;i<t;i++){
cout<<d[i]<<endl;
}
return 0;
}