868. 筛质数
作者:
JayJay在心里
,
2024-08-22 11:14:32
,
所有人可见
,
阅读 4
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
bool st[N]; // 1 - 合数 0 - 质数
int primes[N];
// 朴素筛法 (合数、质数的倍数都用于筛查)
int get_primes1(int n){
int ans = 0;
for(int i = 2; i <= n; i++){ // 外循环是当前数
if(!st[i]) primes[ans++] = i;
int tmp = n / i;
for(int j = 2; j <= tmp; j++) st[j * i] = true;
}
return ans;
}
// 埃氏筛法 (质数的倍数用于筛查)
int get_primes2(int n){
int ans = 0;
for(int i = 2; i <= n; i++){ // 外循环是当前数
if(!st[i]){
primes[ans++] = i;
int tmp = n / i;
for(int j = 2; j <= tmp; j++) st[j * i] = true;
}
}
return ans;
}
// 线性筛法 (质数的倍数用于筛查,并且去除冗余的筛选过程 例如 3 * 2 和 2 * 3)
int get_primes3(int n){
int ans = 0;
for(int i = 2; i <= n; i++){ // 外循环是倍数
if(!st[i]) primes[ans++] = i;
for(int j = 0; primes[j] <= n / i; j++){
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
return ans;
}
int main(){
int n; cin >> n;
// cout << get_primes1(n) << endl;
// cout << get_primes2(n) << endl;
cout << get_primes3(n) << endl;
return 0;
}