目录
前言:
就是有一次比赛我可以用埃式筛法作对题目的,但考场上没记起来(尴尬),所以我也发个博客记录一下,当然不是水博客
普通筛法:
原理:先判断特殊数,再从2开始筛,一直筛到n/i就行了
#include<iostream>
using namespace std;
bool is_prime(int n){
if(n<2)return false;
if(n==2)return true;
for(int i=2;i<=n/i;i++){
if(n%i==0){
return false;
}
}
return true;
}
int main(){
int n;
cin>>n;
if(is_prime(n)){
cout<<"Yes";
}
else{
cout<<"No";
}
return 0;
}
埃式筛法:
原理:先假设所有的数都是素数,把0和1标记上,再用一个循环把所有的和数筛出来。
#include<iostream>
using namespace std;
bool vis[10001];
int n,sum;
int main(){
cin>>n;
vis[0]=vis[1]=1;
for(int i=2;i<=n;i++){
if(vis[i])continue;
for(int j=i+i;j<=n;j+=i){
vis[j]=1;
}
}
for(int i=1;i<=n;i++){
if(!vis[i])sum++;
}
cout<<sum;
return 0;
}
欧拉筛法:
原理:通过质数筛掉他的倍数。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const long long N=1e8+5;
int prim[5800000]={0};
bool dp[N];
long long cnt=0;
int main(){
int n;
cin>>n;
dp[0]=dp[1]=1;
for(int i=2;i<=n;i++){
if(!dp[i]){
prim[cnt++]=i;
}
for(int j=0;j<cnt&&i*prim[j]<=n;j++){
dp[i*prim[j]]=1;
if(i%prim[j]==0){
break;
}
}
}
cout<<cnt;
return 0;
}