洛谷 P3383 [模板] 线性筛素数

洛谷 P3383 [模板] 线性筛素数

传送门:洛谷 P3383 [模板] 线性筛素数

这道题目有一点比较坑:判断素数的时候会判断1与0,蒟蒻就是在这里错了一遍,记得要特判。

首先定义循环量i,j与判断质数的数组p。

然后,就是普普通通的素数筛了,让i从2到n的算数平方根,如果p[i]==0,就让j从i*i到n,将p[i]==1。

筛一遍后,留下的全部都是素数了。

至于为什么要从i*i开始,自己想想吧,比如7:

从49开始,前面的倍数14被2筛去,21被3筛去,28被2筛去,35被5筛去,42被2筛去,自然就是从49开始了。

好了,下面是蒟蒻的代码:

#include<bits/stdc++.h>//万能头
using namespace std;
int i,j,k,m,n,p[10000005];//循环量、输入数据与判素数数组
int main()
{   scanf("%d%d",&n,&k);//输入
    p[0]=p[1]=1;//特判
    for(i=2;i<=sqrt(n);i++)//枚举因子
        if(p[i]==0)//如果是质因子
            for(j=i*i;j<=n;j+=i)//找到所有范围内的倍数
                p[j]=1;//设置为合数
    for(i=1;i<=k;i++){
        scanf("%d",&j);
        if(p[j]==0)//为质数
            puts("Yes");
        else puts("No");
    }
    return 0;//好孩子不忘return 0
}

猜你喜欢

转载自blog.csdn.net/time_h/article/details/81636410
今日推荐