原理
利用每个数均用其最小质因数数筛去
假设一个合数可以分解为X=a1a2a3且a1<a2<a3,那么利用欧拉线性筛法,每个合数只会被最小的质因数筛去
下面是代码实现,使用的是c++
#include <bits/stdc++.h>
#define N 100000
long long i,j;
bool number[N+1];//布尔类型,用来储存是否是素数
long long prime[N+1],count=0;//素数及计数
int main(void)
{
memset(number,true,sizeof(number));//先假设所有的数都是素数
for( i=2; i<N; i++)
{
if(number[i])
prime[count++]=i;//count这样写实现用后加,避免都写一步count++
for( j=0; j<count&&prime[j]*i<=N; j++)
{
number[prime[j]*i]=false;//以prime为最小质因数的数都判定为假
if(i%prime[j]==0) break;//精华部分就在此,这一步中,只要prime[j]是i的质因数(且prime[j]从小到大遍历,故是i的最小质因数),那么此时break,保证不会重复筛,时间复杂度最低
}
}
for(i=2; i<N; i++)
if(number[i]==true)
printf("%d ",i);
return 0;
}