相较于埃氏筛法,这个显得十分复杂甚至九分复杂,他两最大的区别在于标记的次数,效果上除了速度更快,就没有别的区别了。
前面和埃氏没区别,区别在于多了个if语句
他的方法是每执行一次就存一个数,然后在用存的数*刚存的数的那个数做标记,最后输出存下的数的数,不懂的可以看文章的注释
输出100000以内的质数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[100005]={0},pri[10005],i,j,num;//定义数组来标记 ,再定义一个存质数
num=0;
for(i=2;i<=100000;i++)
{
if(a[i]==0)
{
num++;
pri[num]=i;
}
for(j=1;j<=num;j++)//利用循环确保pri的每一个数都取出
{
if(i*pri[j]>100000)//如果大于最大数,则循环结束
{
break;
}
a[i*pri[j]]=1;//将pri的每个数的i倍进行标记
if(i%pri[j]==0)//如果pri是因数,也输出
{
break;
}
}
}
for(i=1;i<=num;i++)//输出pri的所有数
{
cout<<pri[i]<<endl;
}
return 0;
}