筛素数也算是一个必会的知识了 方法有很多
要求:给定一个范围N,你需要处理M个某数字是否为质数的询问
介绍两个方法 都很简单
方法一:朴素算法
首先明确一个道理 一个数如果有因数 那么它肯定有<=它平方根的因数
代码如下
#include<iostream>
#include<cmath>
using namespace std;
#define size 1000001
int num[size];
int n,m;
int Squareroot_;
int work(int number_)
{
Squareroot_=sqrt(number_); //求出来这个数的平方根
if(number_==1){ //1的话特殊判断
cout<<"No"<<endl;
return 0;
}
for(int i=2;i<=Squareroot_;i++){ //从2开始枚举<=该数平方根的数
if(number_%i==0){ //只要能整除就不是素数
cout<<"No"<<endl;
return 0;
}
}
cout<<"Yes"<<endl;
return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>num[i];
work(num[i]);
}
}
//COYG
方法二:埃氏算法
这个方法我比较喜欢 因为很好理解
现将所有2~n的数都写下来 然后将所有2的倍数划去 再将所有3的倍数划去…
这样划完了所有倍数 剩下没划走的 就是素数了
最后进行访问 就能做出判断
代码如下
#include<iostream>
using namespace std;
#define size 10000001
int Instance_[size];
int n,m;
bool num[size]; //都还没划
void sift_()
{
num[0]=num[1]=true; //特判
for(int i=2;i<n;i++){
if(!num[i])
for(int j=2*i;j<=n;j+=i){
num[j]=true;
}
}
}
void work()
{
cin>>n>>m;
sift_(); //开划
for(int i=1;i<=m;i++){ //访问
cin>>Instance_[i];
if(num[Instance_[i]]){
cout<<"No"<<endl;
}
else cout<<"Yes"<<endl;
}
}
int main()
{
work();
}
//COYG
不用把每个数的倍数都划一遍 光划目前还没有被划走的就行
继续努力!