埃氏筛与欧拉筛复习札记
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
const int N =100000;
bool isprime[N];
int prime[N];
int n;
int E_sieve(bool isprime[],int n);
int enlu_sieve(bool isprime[],int n);
int main()
{
cin>>n;
int count;
count=E_sieve(isprime,n);
// count=enlu_sieve(isprime,n);
cout<<count<<endl;
for(int i=0;i<count;i++) {cout<<prime[i]<<" ";}
return 0;
}
int enlu_sieve(bool isprime[],int n)
{
int num = 0;
for(int i = 2; i <= n; i++)
{
if(!isprime[i])
prime[num ++] = i;
for(int j = 0; (j<=num)&&(i*prime[j]<=n); j++)
{
isprime[i*prime[j]] = true; //true是被筛掉的元素。
if(i % prime[j] == 0) //如果满足i%prime[j]==0,
break; //说明 i 不是最小质因子,所以退出循环
}
}
return num;
}
int E_sieve(bool isprime[],int n)
{
int cnt=0;//用来计数
// fill(isprime,isprime+n,1);
memset(isprime,0,sizeof(bool));//memset只能填0、-1、inf
isprime[0]=isprime[1]=true;//1 0 不是素数
for(int i=2;i<=n;i++)//从2开始往后筛
{
if(!isprime[i])
{
for(int j=i*i;j<=n;j+=i)//优化版本j=i*i(j=2*i)
{
isprime[j]=true;
}
prime[cnt]=i;
cnt++;//如果是素数就计数
}
}
return cnt;
}
ps:注意memset只能初始化为0、-1、0x3f3f3f,不能初始化1,建议用fill替换(更加方便)。
以上代码用true表示被筛元素,false表示未被筛除元素。