得到自然数n以内的全部素数,必须把不大于 n \sqrt n n的所有素数的倍数剔除,剩下的就是素数。
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
时间复杂度 O ( n l o g n l o g n ) O(nlognlogn) O(nlognlogn),小数据可用
#include<bits/stdc++.h>
using namespace std;
bool prime[100010];
int main()
{
int n;
cin>>n;
prime[0]=prime[1]=1;
int maxn=sqrt(n);
for(int i=2;i<=maxn;i++)
{
if(!prime[i])
for(int j=i*2;j<=n;j+=i)
prime[j]=1;
}
for(int i=1;i<=n;i++)
if(!prime[i]) cout<<i<<' ';
}