AcWing 868. 筛质数
原题链接
简单
作者:
Doc_kk
,
2023-03-19 16:57:48
,
所有人可见
,
阅读 26
//朴素筛 == 埃氏筛 把每个质数的倍数看作合数删掉
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6+10;
int prime[N],cnt;//prime放质数
bool st[N];//st[i] = true == 不是质数要被筛掉
void get_prime(int n){
for(int i = 2 ; i <= n ; i ++){//质数都是从2开始的
if(st[i]) continue;//如果当前i不是质数 就跳过/筛掉
prime[cnt++] = i;//如果通过上面一个判断是质数了 就把这个记下来 cnt也是要记录的
for(int j = i + i ; j <= n ; j += i)
st[j] = true;//从i+i开始遍历 每次加i就是i的倍数 把他们置true筛掉
}
}
int main(){
int n;
cin >> n ;
get_prime(n);
cout << cnt << endl;
return 0;
}
//线性筛 i是质数就筛掉i与prime中所有质数的乘积;i是非质数筛掉i与prime中所有<=最小质因子的乘积
#include <iostream>
using namespace std;
const int N = 1e6+10;
int prime[N],cnt;
bool st[N];//true = 不是素数该被筛掉
void get_prime(int n){
for (int i = 2; i <= n ; i++){
if(!st[i]) prime[cnt++] = i;//如果i是素数(不该被筛掉) 把i存进prime数组里
for(int j = 0; prime[j] <= n / i; j ++){//j从小到大枚举所有质数
st[prime[j] * i] = true;//每次筛掉当前的质数和i的乘积
if(i % prime[j] == 0)break;//i是j号质数的倍数时 j号质数是i*j号质数的最小质因子
//i % prime[j] != 0时 说明j号质数小于i的所有质因子 所以j号质数还是i*j号质数的最小质因子
}
}
}
int main(){
int n ;
cin >>n ;
get_prime(n);
cout << cnt <<endl;
return 0;
}