洛谷 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
}