1.埃式筛法
从2开始,删掉每一个数的倍数,剩下来的就是质数
#include <iostream>
#include <vector>
using namespace std;
const int N = 100010;
int cnt = 0,prime[N];
bool st[N];
void get_prime(int x)
{
for(int i=2;i<=x;i++)
{
if(!st[i]) // 如果是质数,则需要删除倍数
{
prime[cnt++] = x;
for(int j=i+i;j<=x;j+=i)
{
st[j] = true; // 将所有质数的倍数标记出来
}
}
}
return;
}
int main(void)
{
int n;
cin >>n;
get_prime(n);
cout <<cnt << endl;
return 0;
}
2.线性筛法
#include <iostream>
#include <vector>
using namespace std;
const int N = 100010;
int cnt = 0,primes[N];
bool st[N];
void get_prime(int x)
{
for(int i=2;i<=x;i++)
{
if(!st[i]) primes[cnt++] = i;
// 假设x是一个合数,primes[j]是其最小只因子
// 那么在枚举到i之前,一定会枚举到x/primes[j]
// 那么此时就将x筛掉,可加快速度
for(int j=0;primes[j]<=x/i;j++)
{
st[primes[j]*i] = true;
// primes[j]一定是i的最小只因之
if(i%primes[j]==0) break;
}
}
return;
}
int main(void)
{
int n;
cin >>n;
get_prime(n);
cout <<cnt << endl;
return 0;
}