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

    试着实现的基于分析方法的近似面积光源.

  2. GitHub私有代码库将免费开放

    1月8号消息,微软收购 GitHub 后,官方宣布了一项重大更新:免费开放私有代码库, 即 GitHub 用户现在可以免费创建无限量的私有存储库.同时还有另一项更新——GitHub Enterpris ...

  3. Java知多少(13)流程控制

    Java流程控制的语法与 C/C++ 类似,也有 if...else.while.do...while.for.switch...case等,这里不再讲述具体语法,仅举例说明. 输出九九乘法表(右上三 ...

  4. Java查找出现的单词

    如何找到一个单词的每个出现? 解决方法 下面的例子演示了如何使用Pattern.compile()方法和m.group()方法找到一个词出现次数. import java.util.regex.Mat ...

  5. c#扩展函数

    分页 public static class IEnumerableExt { public static (IEnumerable<T> dataAfterPaging, Pageinf ...

  6. python-docx 设置标题heading的中文字体类型+设置正文的中文字体类型

    依赖包: from docx import Document from docx.shared import Pt from docx.shared import Inches from docx.o ...

  7. ElasticSearch6(二)-- Java API连接es

    此ElasticSearch系列基于最新版的6.2.4版本. 一.pom.xml依赖 <dependencies> <dependency> <groupId>ju ...

  8. 我的第一篇paper

    找实习虽然只为自己争取到一个秋季的绿色通道,但可喜的是,我投的几篇paper,终于中了一篇. 现在可以在英文数据库或google scholar上面搜索到自己名字,感觉很nice,研究生的心愿算是完成 ...

  9. Mariadb 10.3.5 序列号(sequence) 尝鲜

    除了Oracle Mariadb 也有sequence了,前提是Mariadb 10.3以上版本才支持. 但目前的正式版依然是10.2 启动一个Mariadb 10.3.5 docker pull m ...

  10. Android studio启动后卡在refreshing gradle project

    这个问题几乎每个刚使用Android studio的同学都会碰到过,网上有各式各样的方法,有的说使用本地gradle,我试过多次,每次启动Android studio时还是会检查更新,所以根本上解决的 ...