[算法]浅谈求n范围以内的质数(素数)

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

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

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

1、傻子求质数法

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

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

1.1、无优化版本

 1 void prime()
 2 {
 3     int N = 10000;
 4     int primes[N],pos=0;
 5     register int i,j;
 6     for(i=2;i<N;i++){
 7         bool Flag=0;
 8         for(j=2;j<i;j++)
 9             if(i%j==0)Flag=1;
10         if(Flag==0)primes[++pos]=i; 
11     }
12 }

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

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

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

1.2、n/2 优化版本

 1 void prime()
 2 {
 3     int N = 10000;
 4     int primes[N],pos=0;
 5     register int i,j;
 6     for(i=2;i<N;i++){
 7         bool Flag=0;
 8         for(j=2;j<=i/2;j++)
 9             if(i%j==0)Flag=1;
10         if(Flag==0)primes[++pos]=i; 
11     }
12 }

 

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

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

1.3、n开平方优化版本

 1 void prime()
 2 {
 3     int N = 10000;
 4     int primes[N],pos=0;
 5     register int i,j;
 6     for(i=2;i<N;i++){
 7         bool Flag=0;
 8         for(j=2;j<=sqrt(n);j++)
 9             if(i%j==0)Flag=1;
10         if(Flag==0)primes[++pos]=i; 
11     }
12 }

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

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

 


 2、埃氏(Eratosthenes)筛法

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

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

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

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

 1 void prime()
 2 {
 3     int N=10000;
 4     register int i,j;
 5     bool prim[N];
 6     memset(prim,0,sizeof(prim));
 7     prim[1]=1;
 8     for(i=2;i<=sqrt(N);i++)
 9         if(prim[i]==0) 
10             for(j=i+i;j<=N;j+=i)
11             prim[j]=1;
12 }

3、欧拉(Euler)筛选法

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

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

 1 void prime()
 2 {
 3     int N=10000;
 4     int prim[N],bz[N],top=0;
 5     memset(bz,0,sizeof(bz));
 6     register int i,j;
 7     for(i=2;i<=N;i++){
 8         if(!bz[i])prim[++top]=i;
 9          for(j=0;j<=top&&i*prim[j]<=N;j++){
10                  bz[i*prim[j]]=1;
11                  if(i%prim[j]==0)break;
12           }
13     }
14 }

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

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

 

转载于:https://www.cnblogs.com/lihepei/p/10026137.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进入IT行业,要不要参加培训班?

IT行业介绍 考虑培训班无非是要入行,那IT行业好不好?IT行业当然好,看看培训班的数量就知道了。现在房产行业好赚钱,每个小区门口好几家中介门店,相同品牌的可能不止1家。不用去看网上的软文,也不用去问百度,看市场的反应,这是真实的反馈。培训班越来越多,课程越来越多…

python commands_Windows环境下使用python的commands.getstatusoutput

windows调用系统或其他脚本的&#xff0c;常用的是os.popen&#xff0c;次命令本身并不返回执行后的状态&#xff0c;无法用于后续的判断&#xff0c;故尝试Unix下的commands.getstatusoutput&#xff0c;发现在windows下并不能正常使用&#xff0c;如下&#xff1a; >>&…

Kubernetes在上汽集团云平台及AI方面的应用

2019独角兽企业重金招聘Python工程师标准>>> 帆一尚行成立于2015年&#xff0c;是上汽集团的全资子公司&#xff0c;建设有上海、南京、郑州&#xff08;在建&#xff09;三个数据中心&#xff0c;拥有超过4000台物理服务器&#xff0c;10PB的数据存储&#xff0c;总…

我的Java培训经历

此文讲述我的Java开发培训经历&#xff0c;来解答关心的培训费、培训节奏、就业等问题。 我在2010年参加达内Java培训&#xff0c;如今再回首那段时光&#xff0c;虽然辛苦&#xff0c;但很值得&#xff01;&#xff08;后悔参加培训班&#xff0c;大部分原因是冲动&#xff0…

python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

首先&#xff0c;先介绍两种引入模块的方法。 法一&#xff1a;将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二&#xff1a;只引入某个文件中一个类/函数/变量 需要从某个文件中引入多个函数或变量时&#xff0c…

软件培训技术选哪个?

要培训了,培训技术怎么选? 技术需慎重选 女怕嫁错郎,男怕入错行。后悔参加培训班,因为技术没选好的占比很高。 技术没选好会有什么影响? 近的影响是就业!远的影响是发展! 对于程序员来说,技术就是立身之本,需要慎重选择! 我在《要不要参加培训班?》文章中介绍…

django安装_技术大牛详解:Django框架之环境安装

黑马程序员视频库播妞微信号&#xff1a;boniu236传智播客旗下互联网资讯、学习资源免费分享平台虚拟环境安装:开发中问题&#xff1a;如何在同一台主机中&#xff0c;要开发多个不同的项目&#xff0c;而且需要用到同一个包的不同版本&#xff1f;尝试分析&#xff1a;在开发过…

安装 Alibaba Cloud Toolkit

IntelliJ IDEA版 JetBrains 插件市场下载 Eclipse 版 Eclipse 插件市场仓库下载 (推荐)URL 地址在线安装Maven 版 在 POM 文件中依赖 PyCharm、PhpStorm、RubyMine 和 WebStorm 版 公测中官网https://toolkit.aliyun.com 交流群&#xff08;钉钉&#xff09; 交流群&#xff08…

软件Java前端大数据培训机构怎么选?

先看这篇文章《要不要参加培训班》。 选技术就像选另一半,那选培训机构就是选另一半的家庭。另一半家庭好与不好,与婚后幸福生活息息相关。 选培训机构的几个维度: 1.成立时间 2.专业性 3.市场普及率 成立时间 成立久的不一定好,比如北大某鸟 成立不足3年的,不要选…

高效管理论坛广告贴的小窍门

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。这里提供一个关于如何管理论坛广告贴的深度视角。一般的论坛在发展初期&#xff0c;用户自发产生的内容不多&#xff0c;每一条数据都弥足珍贵&#xff0c;因此几乎不会考虑到反垃圾需求。随着产品规模的扩大&…

Chrome浏览器多开,亲测有效

原理 指定不同的用户目录&#xff0c;就可以实现多开。即&#xff1a;"--user-data-dir" 指定不同的目录。 操作 新建用户目录文件夹 要开几个&#xff0c;就新建几个&#xff0c;文件夹名随意。 复制chrome快捷方式 修改目标路径 每个快捷方式&#xff0c;修改…

计算机技术与软件专业技术资格(水平)考试 全国各省市成绩查询

大家好&#xff0c;我是51CTO学院的文慧&#xff0c;目前收到很多参加软考考试的学生针对考试成绩查询的问题&#xff0c;无法一一帮助到大家&#xff0c;故开此博客&#xff0c;希望可以帮助到大家。 2018年下半年软考合格标准是多少&#xff1f;根据近几年软考合格标准来看&a…

培训时常犯的学习误区与应对方法

和在学校里上课一样,同一位老师教,同班同学成绩不同。同学之间的资质都是差不多的,因学习方法不同,学习心态不同,课后努力程度不同导致的成绩差异。 本文介绍下培训时容易犯的学习误区和误区的应对方法。 误区1 不懂不明白的地方,非要打破铁锅问到底。 应对方法 培训…

julia有没有希望超越python_未来5-10年,Julia会替代Python成为量化投资热门语言吗?...

今年上过一个quantative programming的课程&#xff0c;去年教学用的语言还是python&#xff0c;加速的方法用的是jit即时编译来提高编程效率&#xff0c;今年课程的设计就改成Julia了。 因为自己从2016年起数据研究用的都是python&#xff0c;所以最开始使用Julia的时候并不习…

常见的三种撞库方法

欢迎访问网易云社区&#xff0c;了解更多网易技术产品运营经验。 在安全领域向来是先知道如何攻&#xff0c;其次才是防。在介绍如何防范网站被黑客扫描撞库之前&#xff0c;先简单介绍一下什么是撞库&#xff1a;撞库是黑客通过收集互联网已泄露的用户和密码信息&#xff0c;生…

超越培训班同学的独门绝技

​​​​​​​本文讲3个独门绝技,十多年苦练多得,只传有缘人。 ​​​​​​​ 不订阅,就是不给看 绝技1 -----权益保护线----- -----权益保护线----- -----权益保护线----- -----权益保护线----- -----权益保护线----- 写CSDN博文 CSDN上有不少参加培训班的…

python逐个读取字符_玩转python之字符串逐个字符或逐词反转

众所周知&#xff0c;python中的字符串是无法改变的&#xff0c;反转一个字符串自然要创建一个拷贝&#xff1b;最简单的方法&#xff0c;当然是步长为“-1”的切片&#xff1a; result astring[::-1] 如果要是按单词来反转&#xff0c;需要三步完成&#xff1a;字符串--->…

WPF TextBox 正则验证 大于等于0 小于等于1 的两位小数

原文:WPF TextBox 正则验证 大于等于0 小于等于1 的两位小数正则&#xff1a;^(0\.\d|[1-9][0-9]|1)$ TextBox绑定正则验证 <TextBox x:Name"txb" MaxLength"6" Margin"1 0 0 0" Width"40" > <TextBox.Text> …

DataQ数据对象为空的解决方法

问题 在dataq上面创建周期任务的时候发现了这么一个问题&#xff0c;配置好目标源之后&#xff0c;数据对象的下拉选项中是空的&#xff0c;如下图。 原因 是因为目前无法使用自动创建目标表功能&#xff0c;需要自己去dataworks上面先自己创建好。 措施 1.创建目标表 2.创…

pythonifnotnone_使用 if x is not None 还是if not x is None

使用 if x is not None 还是if not x is None呢&#xff1f; 谷歌的风格指南和PEP-8都使用if x is not None&#xff0c;那么它们之间是否存在某种轻微的性能差异呢&#xff1f;通过测试发现没有性能差异&#xff0c;因为它们编译为相同的字节码&#xff1a;Python 2.6.2 (r262…