C++的素数筛
·
素数筛
素数是大于1,并且除了1和它本身不能被其他自然数整除的自然数。
最小的自然数是2,也是唯一的偶素数;
1、暴力枚举(n<1e4)
#include<bits/stdc++.h>
using namespace std;
# define int long long
//判断单个数字是不是素数
int isp(int num){
if(num<2){
return 0;//小于2的都不是素数
}
//只遍历到根号num,减少循环次数
for(int i=2;i*i<num;i++){
if(num%i==0){
return 0;//能被整除的就不是素数,结束
}
}
return 1;//是素数
}
signed main(){
int x;
cin>>x;
if(isp(x)){//调用函数判断是不是素数
cout<<"Y";
}
else{
cout<<"N";
}
return 0;
}
2、埃氏筛
定义一个布尔数组isp[],isp[i]表示数字i是否是素数,初始全设置为素数,为真
从最小的素数2开始,将所有2的倍数标记为假
依次遍历后续数字,如果当前是素数,就标记素数所有的倍数为假
最终数组中值为真的下标,就是1到N中所有的素数
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=10005;
bool isp[N];
void solve(){
//初始化:先默认所有的数都是素数,为真
for(int i=2;i<N;i++){
isp[i]=true;
}
for(int i=2;i*i<N;i++){
if(isp[i]){//如果i是素数,标记它的所有倍数为假
for(int j=i*i;j<N;j+=i){
isp[j]=false;
}
}
}
}
signed main(){
solve();
int x;
cin>>x;
if(isp[x]){
cout<<"y"<<endl;
}
else{
cout<<"n";
}
return 0;
}
更多推荐

所有评论(0)