判断质数的方法有很多,首先是最简单的试除法,判断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.

isprime_判断质数的更多相关文章

  1. C# 判断质数的2种基本方法

    质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 目前学习了判断数字n是否为质数的2种基本方法: 一.计数法 根据定义,既然质数只 ...

  2. JAVA判断质数

    好久没写了,今天做题有点忘了,不会写了.重新做了一份,整理出来. import java.util.Scanner; public class 判断质数 { public static boolean ...

  3. 杭电oj 2098——分拆素数和(包含如何判断质数及优化),java实现

    question:分拆素数和 思路: 1.首先从1一直遍历到数据的1/2位置(因为后面的会和前面的重复),因为是要两个数,所以另一个数就是原数据减去遍历的数字(即i 和data-i),如果二者同时为质 ...

  4. C#如何判断质数(转)

    要求:重复让用户输入输入一个数,判断该数是否质数,当输入“q”时,程序运行结束!(质数的判断要求用方法来实现). class Program { static void Main(string[] a ...

  5. Java经典案例之-判断质数(素数)

    /** * 描述:任意输入两个数n,m(n<m)判断n-m之间有多少个素数,并输出所有素数. * 分析:素数即质数,除1和本身之外,不能被其他自然数整除的数. * 判断素数的方法为:用一个数分别 ...

  6. 判断质数(Java)

    package day01; //输出1-100中质数,并且每十个换行 public class PrimeNum { public static void main(String[] args) { ...

  7. 【python实例】判断质数:for-break-else

    """ for 变量 in 容器: 遍历--break 如果执行到了break语句, 则else不会被执行 else: break语句没有被执行时, 执行else &qu ...

  8. C语言之判断质数算法

    今天学校OJ的一题判断是质数和合数. 首先我们要弄明白质数和合数的概念:质数就是除了本身和1以外没有其他因数的数,合数就是除了本身和1以外还有其他因数的数.注意:1既不是质数也不是合数. 明白了概念, ...

  9. Python小例子(判断质数)

    只能被自己或者1整除的数为质数 num = int(input('请输入一个数:')) if num > 1: # 查看因子 for i in range(2, num): if (num % ...

随机推荐

  1. 重定向如何携带cookie

    起因 最近在做微信开放平台,需要给第三方入住,而且入住方都有自己的二级域名.做过微信开发的人都知道,坑爹的是微信并不支持这种二级域名的方式,所以用一个域名专门来处理. 问题 然后由于采用了一个专门的域 ...

  2. 创建shell脚本

    1.写一个脚本 a) 用touch命令创建一个文件:touch my_script b) 用vim编辑器打开my_script文件:vi my_script c) 用vim编辑器编辑my_script ...

  3. ubuntu12.04安装Docker

    由于公司的虚拟机上的ubuntu都是12.04的,所以要在ubuntu12.04上安装Docker.Docker目前只能运行在64位的机器上面. 先要升级内核 sudo apt-get update ...

  4. 5 款最新的 jQuery 图片裁剪插件

    这篇文章主要介绍最新的 5 款 jQuery 图片裁剪插件,可以帮助你轻松的实现你网站需要的图像裁剪功能. Cropit Cropit 是一个 jQuery 插件,支持图像裁剪和缩放功能.Cropit ...

  5. 嵌入式开发之hi3519---i2c MDIO PHY uboot phy调试总结

    首先调试检查硬件,再调试软件 首先仔细阅读phy和主芯片datesheet ,尤其着重阅读mii寄存器,它是mac和phy交换信息的媒介. 硬件注意:关于phy的芯片需要注意的有几点:1.mdio接口 ...

  6. Oracle 11g EM删除重建的方法

    虚拟机里的Oracle 11g好长时间没用了,突然打开之后发现EM无法访问了,EM可以重建,于是也不打算查找原因了,直接使大招 OS:Windows Server 2012 Oracle:11g R2 ...

  7. Win10系统中VirtualBox桥接时找不到网卡的问题

    1.主机中 点网络连接 ,点 本地网络,右键属性 2.安装 服务 磁盘安装 选择 VirtualBox 安装目录, 找到 目录文件 D:\Users\Oracle\VirtualBox\drivers ...

  8. [Bayes] dchisq: Metropolis-Hastings Algorithm

    dchisq gives the density,                          # 计算出分布下某值处的密度值 pchisq gives the distribution fun ...

  9. [Laravel] 10 - WEB API : wrapper

    前言 一.常用的解决方案 React 前端 + PHP (Laravel) 后端 Such as "some exposure to WEB API’s and/or RESTful“. 使 ...

  10. 05原型模式Prototype

    一.什么是原型模式 Prototype模式是一种对象创建型模式,它采 取复制原型对象的方法来创建对象的实例.使用 Prototype模式创建的实例,具有与原型一样的 数据. 二.原型模式的特点 1. ...