汗颜,数学符号表达今天才学会呀-_-#

下面是百度百科对质数的定义

质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数
求质数的方法自然不少,但主要还是有三大方法,它们运用在不同的领域,根据数据也会变化;

1、傻子求质数法

这种方法十分无脑,任何一个人都能想出来,但这种方法竟然还有几个优化ORZ

时间复杂度是O($N^{2}$);

1.1、无优化版本

 void prime()
{
int N = ;
int primes[N],pos=;
register int i,j;
for(i=;i<N;i++){
bool Flag=;
for(j=;j<i;j++)
if(i%j==)Flag=;
if(Flag==)primes[++pos]=i;
}
}

这也是所有求质数中最朴素的求法,自然在平常当中不会使用。

然而有些奇葩题目,求质数的次数很少,就可以用这个啦。↖(^ω^)↗

证明:质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数 ——百度百科。

1.2、n/2 优化版本

 void prime()
{
int N = ;
int primes[N],pos=;
register int i,j;
for(i=;i<N;i++){
bool Flag=;
for(j=;j<=i/;j++)
if(i%j==)Flag=;
if(Flag==)primes[++pos]=i;
}
}

这种优化就比上一种快一倍(时间复杂度),但仍然有缺陷,能不能再快一点??_?

证明:x/2以上的数增加就会重复。

1.3、n开平方优化版本

 void prime()
{
int N = ;
int primes[N],pos=;
register int i,j;
for(i=;i<N;i++){
bool Flag=;
for(j=;j<=sqrt(n);j++)
if(i%j==)Flag=;
if(Flag==)primes[++pos]=i;
}
}

这个就是傻子求法的最终版本了,时间复杂度已经优化到了极限(个人认为)。囧rz

证明:因为x=$\sqrt{N}^{2}$的平方,所以sqrt(x)以上的数增加就会重复。


2、埃氏(Eratosthenes)筛法

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。——百度百科

这种筛法大概是我初一学了快一个学期,开始学质因数时,自己过不了找质数一个题,然后接触的一个算法。

埃氏的筛法思想精华,主要是把质数的倍数剔除,剩下的那些就是质数。+_+

这种算法的时间复杂度是O(nloglogn)。

 void prime()
{
int N=;
register int i,j;
bool prim[N];
memset(prim,,sizeof(prim));
prim[]=;
for(i=;i<=sqrt(N);i++)
if(prim[i]==)
for(j=i+i;j<=N;j+=i)
prim[j]=;
}

3、欧拉(Euler)筛选法

欧拉筛法就是所谓中的高级筛法,时间复杂度削减到了O(N)。

它的思想是在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。

 void prime()
{
int N=;
int prim[N],bz[N],top=;
memset(bz,,sizeof(bz));
register int i,j;
for(i=;i<=N;i++){
if(!bz[i])prim[++top]=i;
for(j=;j<=top&&i*prim[j]<=N;j++){
bz[i*prim[j]]=;
if(i%prim[j]==)break;
}
}
}

自己还有很多东西都没有学到,不知道什么时候才能脱掉蒟蒻的外套呢。

博主是初中蒟蒻,能力弱,还请大家多多提出改进建议:-D      ——2018.11.27

[算法]浅谈求n范围以内的质数(素数)的更多相关文章

  1. Kmp算法浅谈

    Kmp算法浅谈 一.Kmp算法思想 在主串和模式串进行匹配时,利用next数组不改变主串的匹配指针而是改变模式串的匹配指针,减少大量的重复匹配时间.在Kmp算法中,next数组的构建是整个Kmp算法的 ...

  2. 浅谈求lca

    lca即最近公共祖先,求最近公共祖先的方法大概有3种,其实是窝只听说过3种,这3种做法分别是倍增求lca,树剖求lca和tarjan求lca,但是窝只会前2种,所以这里只说前2种算法了. 首先是倍增求 ...

  3. Pollard Rho算法浅谈

    Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...

  4. Sunday算法浅谈

    一.Sunday算法简介 Sunday算法在我看来比起Kmp和bm都更加容易理解,代码实现也更加简洁.Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似只不过S ...

  5. 算法浅谈之DP悬线法

    悬线法 用途 解决给定矩阵中满足条件的最大子矩阵 做法 用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界 定义 \(left[i][j]\):代表从\((i,j)\)能到达的最左位置 \ ...

  6. 浅谈URLEncoder编码算法

    一.为什么要用URLEncoder 客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将 ...

  7. 浅谈Hex编码算法

    一.什么是Hex 将每一个字节表示的十六进制表示的内容,用字符串来显示. 二.作用 将不可见的,复杂的字节数组数据,转换为可显示的字符串数据 类似于Base64编码算法 区别:Base64将三个字节转 ...

  8. 浅谈Base64编码算法

    一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ...

  9. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

随机推荐

  1. RESTful API接口文档规范小坑

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. 前后端分离的开发模式,假如使用的是基于RESTful API的七层通讯协议,在联调的时候,如何避免配合过程中出现问 ...

  2. Maven-常用插件

    罗列笔者认为比较有用的一些maven打包插件,方便后续查阅 spring-boot-maven-plugin springboot自带的maven插件,可用于简单的JAR/WAR方式打包,官方地址为h ...

  3. PHP一些常用的正则表达式分享给大家

    一.校验数字的表达式 1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 至少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和非零开头的数字:^(0|[1-9][0- ...

  4. SAP 没有激活HUM功能照常可以使用Handling Unit

    SAP 没有激活HUM功能照常可以使用Handling Unit 笔者所在的项目上的公司间STO的流程里,发货公司在做PGI之后系统自动触发收货公司的inbound delivery单据,发货公司发出 ...

  5. cesium 之地图显示坐标、比例尺、海拔高度效果篇(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  6. java压缩指定目录下的所有文件和文件夹的代码

    将代码过程较好的代码段备份一下,下边资料是关于java压缩指定目录下的所有文件和文件夹的代码,希望对码农有帮助. String sourceDir="E:\test";int pa ...

  7. vs code配置flutter开发android

    下载flutter_sdk压缩包,解压到指定目录,把sdk的bin目录添加到系统环境变量Path 设置中国临时镜像:添加两个系统变量 FLUTTER_STORAGE_BASE_URL=https:// ...

  8. Delphi IfThen语句

    function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string; overload; $[StrU ...

  9. C#标识符与关键字

    标识符是指在程序中用来表示实物的单词,是分配给类型(类.结构.枚举.接口或委托).成员.变量或命名空间的名称.有效标识符必须遵循以下原则: 标识符不能以数字开头也不能包含空格: 标识符可以包含大小写字 ...

  10. 想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜

    本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事.有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况.于是周榜(按周重置更新的榜单)诞生了 ...