| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 算法:判断质数,从简单到高效 -> 正文阅读 |
|
[数据结构与算法]算法:判断质数,从简单到高效 |
从小学起我们就接触过质数(素数),它也是我们日常写题过程中常见的一个要素。今儿咱就来唠唠怎么来判断素数 质数的定义: 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 注意:最小的质数是2。 一、简单思维: 既然已经知道了质数的定义,很容易就想到根据定义来判断一个数是否为质数。 那么就来试一试吧! 方法(一):直观判断
这么做的思维简单,但相应的就会消耗大量时间,效率不高。 我们稍加改进 方法(二):引入平方根 假设一个数n能被因式分解为两个数a和b,那么它们一定满足a<sqrt(n)<b。这个条件很容易理解。也就是说,找到比sqrt(n)小的因子就不需要再麻烦去算大的那个了。由此,我们可以减少一般的运算量。
二、思维拓展:筛选算法 方法(三):埃氏筛 当我们找到一个质数时,这个质数的任意倍数(与另一数相乘)肯定都是合数,便把它筛除。从2开始遍历,先判断这个数是否被筛除过,如果没有,那么这个数肯定时质数,就用它来筛除它的倍数,否则就跳过。
这样的方法相比上面,已经很简便了。但是我们再思考一点:取一个数18,可以被分解为2*9或3*8,那么在筛除时将会访问两次。这样就导致了这种算法的时间复杂度为o(nlogn)。我们能不能通过一点调整,将方案再一次优化呢? 答案是肯定的! 方法(四):欧拉筛/线性筛 为了解决这个问题,便出现了一个快速的线性筛法,也称为欧拉筛法。欧拉筛法没有冗余,不会重复筛除一个数,所以“几乎”是线性的,复杂度为O(n)。 欧拉筛法就是在埃氏筛的基础上,让每一个非质数都由其最小质因数筛去,从而避免了重复计算,提高了效率。
其中
正是最关键的一步,因为这一步的存在,表明prime[j]是i的最小质因数,此时需要退出。这样便保证了接下来筛除的数也是被最小质因数筛掉的。 举个例子: 比如21=3*7,当枚举到质因数3(prime[j]==3)时,有21%3==0,此时应该退出。否则下一个质数为5,会筛去21*5=105。但是105=3*5*7,会优先被3筛去,不应被此时的5筛去。这样就会导致重复运算。 以上就是本期算法的全部内容,学会了赶紧去试一试吧! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 18:23:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |