简介:
欧拉筛法也称为线性筛法,它通过避免埃拉托斯特尼筛法中的重复筛选来优化筛法,确保每个数只被其最小的质数的因数筛选一次。
其思想是每个合数只被它最小的质数筛掉,比如30,只被2筛掉,而在3和5的时候,不去判断30是不是合数。
大致思路:
1、 从最小的素数2开始,将其标记为已筛选。然后考虑下一个未被标记的素数,将其所有倍数标记为合数。由于每个合数至少有一个质因子小于等于它本身,因此只要保证小于它的质因数的倍数被筛选即可。
2、 在遍历过程中,一旦遇到一个数已经被之前的素数的倍数标记为合数,就跳过对该数的进一步筛选,因为该数已经被筛选过。
样例代码:
#include<iostream>
using namespace std;
int main()
{
int a[100005]={0},pri[10005];
int i,j,num;
num=0;
for(i=2;i<=100000;i++)
{
if(a[i]==0)
{
pri[++num]=i;
}
for(j=1;j<=num;j++)
{
if(i*pri[j]>100000)
{
break;
}
a[i*pri[j]]=1;
if(i%pri[j]==0)
{
break;
}
}
}
for(i=1;i<=num;i++)
{
cout<<pri[j]<<endl;
}
return 0;
}