题
给定一个正整数 n,请你求出 1∼n 中质数的个数。
输入格式
共一行,包含整数 n。
输出格式
共一行,包含一个整数,表示 1∼n中质数的个数。
数据范围
1≤n≤10^6
输入样例:
8
输出样例:
4
解
朴素筛法:
void gpri(int n){//朴素筛法
for(int i = 2; i <= n; i++){
if(st[i])continue; //已被筛除
pri[cnt++] = i; //2~i未被筛除一定是质数
for(int j = i + i; j <= n; j += i){
st[j] = true; //筛除质数的倍数
}
}
}
线性筛法 :
void gpri(int n){//线性筛法
for(int i = 2; i <= n; i++){
if(!st[i])pri[cnt++] = i; //未被筛选
for(int j = 0; pri[j] <= n / i; j++){ //
st[pri[j] * i] = true; //筛
if(i % pri[j] == 0)break; //能整除,pri[j]一定是i的最小质因子
}
}
}
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int cnt;
int pri[N];
bool st[N];
// void gpri(int n){//朴素筛法
// for(int i = 2; i <= n; i++){
// if(st[i])continue; //已被筛除
// pri[cnt++] = i; //2~i未被筛除一定是质数
// for(int j = i + i; j <= n; j += i){
// st[j] = true; //筛除质数的倍数
// }
// }
// }
// void gpri(int n){//线性筛法
// for(int i = 2; i <= n; i++){
// if(!st[i])pri[cnt++] = i; //未被筛选
// for(int j = 0; pri[j] <= n / i; j++){ //
// st[pri[j] * i] = true; //筛
// if(i % pri[j] == 0)break; //能整除,pri[j]一定是i的最小质因子
// }
// }
// }
int main(){
int n;
cin >> n;
gpri(n);
cout << cnt << endl;
return 0;
}