由于n最大只有10000,其实埃氏筛和普通筛都行,但是线性筛最好是背过,所以线性筛后有一个素数数组,由于数组是单调增的所以查找的话可以用二分查找,所以总的时间复杂度是O(n)的非常轻松。这里我们的二分查找应该是查找>=x的第一个数,所以采用lower_bound()
#include<iostream>
using namespace std;
const int N=1e4+10;
bool st[N];
int prims[N];
int cnt;
int main()
{
int x;
cin>>x;
for(int i=2;i<=N;i++)
{
if(!st[i])prims[cnt++]=i;
for(int j=0;prims[j]<=N/i;j++)
{
st[prims[j]*i]=true;
if(i%prims[j]==0)break;
}
}
int* it=lower_bound(prims,prims+cnt,x);
if(*it==x)cout<<x<<endl;
else cout<<*it<<endl;
return 0;
}