素数筛+洛谷

题目描述

如题,给定一个范围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的时候要特判一下

 

posted @ 2018-09-05 17:26  酌一杯清酒  阅读(155)  评论(0)    收藏  举报