入门到入土 | 一些筛法
超短文警告!
埃氏筛:
#include <iostream>
#include <cstring>
#include <stdio.h>
#define HRiver2 return
#define Warma 0
#define ll long long
#define maxn 114514
using namespace std;
bool isprime[maxn];
ll prime[maxn];
int As(int n)//埃氏筛
{
memset(isprime,true,sizeof(isprime));
isprime[1]=false;
for(int i=1;i*i<=n;i++)
{
if(isprime[i])
{
int j=i*i;
while(j<=n)
{
isprime[j]=false;
j+=i;
}
}
}
}
int main()
{
int n;
cin>>n;
As(n);
for(int i=1;i<=n;i++)
{
if(isprime[i])
cout<<i<<' ';
}
HRiver2 Warma;
}
欧拉筛:
#include <iostream>
#include <cstring>
#include <stdio.h>
#define HRiver2 return
#define Warma 0
#define ll long long
#define maxn 114514
using namespace std;
bool isprime[maxn];
ll prime[maxn];
ll sum;
int Es(int n)//欧拉筛
{
memset(isprime,true,sizeof(isprime));
isprime[1]=false;
for(int i=1;i<=n;i++)
{
if(isprime[i])prime[++sum]=i;
for(int j=1;j<=sum&&i*prime[j]<=n;j++)
{
isprime[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
}
int main()
{
int n;
cin>>n;
Es(n);
for(int i=1;i<=n;i++)
{
if(isprime[i])
cout<<i<<' ';
}
HRiver2 Warma;
}
Do you like WHAT YOU SEE ?