1、利用枚举法来判断一个整数是否为质数
#include<iostream>
using namespace std;
#include<algorithm>
#include<math.h>
#include <bits/stdc++.h>
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int m;int flag=0;
cin>>m;
if(m<2){
cout<<m<<" ";
}
else{
for(int j=2;j<=pow(m,0.5);j++)
{
if(m%j==0)
{
flag=1;//不是质数,对该数进行标记
break;
}
}
if(flag==0){ //经过多次筛选都未被标记,说明就是质数
cout<<m<<" ";
}
}
}
return 0;
}
2、洛谷-5723 质数口袋
基于标题1,可用枚举法解决这道题
#include<iostream>
using namespace std;
#include<algorithm>
#include<math.h>
#include <bits/stdc++.h>
int main()
{
int n;
cin>>n;
int sum=0;
int count=0;
for(int m=2;m<=n;m++)
{
int flag=0;
for(int j=2;j<=pow(m,0.5);j++)
{
if(m%j==0)
{
flag=1;//不是质数
break;
}
}
if(flag==0){
sum=sum+m;
if(sum>n)
break;
cout<<m<<endl;
count++;
}
}
cout<<count<<endl;
return 0;
}
3、洛谷-P3383 线性筛素数
(1)欧拉筛
#include<iostream>
#include<stdio.h>
#include <cstdio>
#include <cstring>
#include<string>
#include<string.h>
#include<math.h>
using namespace std;
//大数组要放到全局区
bool a[10000001]; //1~10000001
int b[100001]; //用来记录质数的
int main()
{
int count=0;
double n,q;
cin>>n>>q;
memset(a,1,sizeof(a)); //假设所有整数为素数
a[1]=0;
for(int i=2;i<=n;i++)
{
if(a[i])
b[++count]=i;
for(int j=1;j<=count&&i*b[j]<=n;j++)
{
a[i*b[j]]=0; //开始筛选
if(i%b[j]==0)
break;
}
}
for(int i=0;i<q;i++)
{
int num;
cin>>num;
cout<<b[num]<<endl;
}
return 0;
}
(2)埃式筛
#include<iostream>
#include<stdio.h>
#include <cstdio>
#include <cstring>
#include<string>
#include<string.h>
#include<math.h>
using namespace std;
//大数组要放到全局区
bool a[10000001]; //1~10000001
int b[100001]; //用来记录质数的
int main()
{
int count=0;
double n,q;
cin>>n>>q;
memset(a,0,sizeof(a)); //假设所有整数为素数
a[1]=1;
for(int i=2;i<=n;i++)
{
if(a[i]==0)
{
b[++count]=i;
for(int j=i;i*j<=n;j++)
a[i*j]=1;
}
}
for(int i=0;i<q;i++)
{
int num;
cin>>num;
cout<<b[num]<<endl;
}
return 0;
}
个人觉得埃式筛选法更好理解,但是时间开销大,高级点就用欧拉筛(狗头)。
还有,这只是本人做的算法答案并不是标准答案,把代码复制提交上去会显示空间爆棚(狗头)。