素数筛+洛谷
题目描述
如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)
输入输出格式
输入格式:
第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。
接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。
输出格式:
输出包含M行,每行为Yes或No,即依次为每一个询问的结果。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
bool isPrime( int num )
{
//两个较小数另外处理
if(num ==2|| num==3 )
return 1 ;
//不在6的倍数两侧的一定不是质数
if(num %6!= 1&&num %6!= 5)
return 0 ;
int tmp =sqrt( num);
//在6的倍数两侧的也可能不是质数
for(int i= 5;i <=tmp; i+=6 )
if(num %i== 0||num %(i+ 2)==0 )
return 0 ;
//排除所有,剩余的是质数
return 1 ;
}
int main()
{
int n,m,k;
while(scanf("%d%d",&n,&m)==2){
for(int i=0;i<m;++i){
scanf("%d",&k);
if(k==1){
printf("No\n");
continue;
}
if(isPrime(k)==1){
printf("Yes\n");
}
else{
printf("No\n");
}
}
}
return 0;
}
时间复杂度O(sqrt(n),数据为1的时候要特判一下

浙公网安备 33010602011771号