线性筛素数法
#include
#define N 10000
int n,i,j,ps,pr[N];
bool b[N];
int main()
{
scanf("%d",&n);
for(i=2;i<=n;i++)
{
if(!b[i]) pr[++ps] = i; // 如果没有被筛除,说明该数为素数,加入素数列表
for(j=1;j<=ps&&i*pr[j]<=n;j++)
{
b[i*pr[j]] = 1; // 筛除当前数与已知素数的乘积
if(i%pr[j]==0) break;
// 去除重复,保证时间复杂度(不加上这一句的话答案也正确,但是数据较大时时间延长了几倍)
// 这么做的原因就是,根据算术基本定理,
// 合数可以分解成若干不同质因数之积,那么筛除一个合数的方法就有多种,也就是会带来重复计算
// 所以考虑让每个合数只被最小的那一个质因数筛除
// 那么,如果i存在质因数pr[j],则大于pr[j]的质数不是i*pr[j]的最小质因数(因为已经有更小的质因数pr[j])
// 所以这个break可以减少冗余,从而达到时间复杂度上的保证
}
}
for(i=1;i<=ps;i++) printf("%d ",pr[i]);
// 最终2~n中素数存在pr数组中
return 0;
}