判断质数的方法有很多,首先是最简单的试除法,判断n以内的质数的话时间复杂度为n*sqrt(n)当然是很慢的了

下面提供三种判断质数的方法:

首先是跑5051ms的这个是埃拉托斯特尼筛法 且不加优化 核心质数的倍数一定不是质数

#include<iostream>
#include<cmath>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
inline long long read()
{
long long x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const long long maxn=;
long long n,m;
long long a[maxn];
void bwy()//闻道玉门犹被遮,应将性命逐轻车
{
for(long long i=;i<=m;i++)a[i]=;
a[]=;
for(long long i=;i<=m;i++)
{
if(a[i]==)
{
for(long long j=i<<;j<=m;j+=i)
{
a[j]=;
}
}
}
}
int main()
{
//freopen("1.in","r",stdin);
m=read();n=read();
bwy();
for(long long i=;i<=n;i++)
{
long long x;
x=read();
if(a[x]==)printf("Yes\n");
else printf("No\n");
}
return ;
}

从当前质数的1倍筛到n/i倍即可。

然后第二种是其优化算法 也是竞赛之中使用最多的筛法。经观察发现可以从i*i筛到n/i;这样即可。

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<vector>
#include<queue>
#include<map>
#include<stack>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
int a[];
void wy()
{
a[]=;
for(int i=;i<=n;i++)
{
if(a[i]==)
{
for(int j=i;j<=n/i;j++)
{
a[i*j]=;
}
}
}
}
int main()
{
//freopen("1.in","r",stdin);
n=read();m=read();
wy();
for(int i=;i<=m;i++)
{
int x;
x=read();
if(a[x]==)printf("Yes\n");
else printf("No\n");
}
return ;
}

第三种则是真正的线性筛法了,埃拉筛法。找到每个数的最小质因子使筛出的数字只被唯一筛出~

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<ctime>
#include<vector>
#include<queue>
#include<map>
#include<stack>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m;
int prime[],v[],top=;//v数组里存在i的最小质因子
void wy()
{
memset(v,,sizeof(v));
for(int i=;i<=n;i++)
{
if(v[i]==){v[i]=i;prime[++top]=i;}
for(int j=;j<=top;j++)
{
if(prime[j]>v[i]||prime[j]>n/i)break;
v[i*prime[j]]=prime[j];
}
}
}
int main()
{
//freopen("1.in","r",stdin);
n=read();m=read();
wy();
for(int i=;i<=m;i++)
{
int x;
x=read();
if(v[x]==x)printf("Yes\n");
else printf("No\n");
}
return ;
}

You're perfectly wrong for me.

最新文章

  1. VBA实例收集
  2. sqlite采用的ORM包
  3. 【虚拟机】苹果虚拟机mac10.11.6+Xcode8.1
  4. 代码片段 - Golang 创建 .tar.gz 压缩包
  5. IIS功能查看、配置
  6. Makefile自动生成头文件依赖
  7. Flash Stage3D 在2D UI 界面上显示3D模型问题完美解决
  8. javascript定时器:setTimeout与setInterval
  9. 百度编辑器ueditor简单易用
  10. Bootstrap常用单词组
  11. nagios nrpe
  12. Intellij-配置JDK版本和编译版本
  13. Cent OS 常用命令搜集
  14. 每日英语:March Remembers King&#39;s Dream
  15. 向量类Vector
  16. Ceph中的容量计算与管理
  17. TableView刷新 局部刷新等
  18. (七)insmod/rmmod
  19. C++程序在Windows平台上各种定位内存泄漏的方法,并对比了它们的优缺点
  20. UVA11551 Experienced Endeavour —— 矩阵快速幂

热门文章

  1. Java 汇编代码
  2. mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法
  3. Oracle调整内存超出限制出现ORA-27100: shared memory realm already exists问题解决办法
  4. Spark学习笔记——房屋价格预测
  5. ViewPager PagerAdapter not updating the View
  6. mysql 第二高薪水
  7. duilib进阶教程 -- 在MFC中使用duilib (1)
  8. JSON的多种转换
  9. 腾讯云Badjs镜像使用入门
  10. mvc4安装、新建、模版简介