判断素数(质数)高效算法
最近看到一篇高效的素数判断算法文章,但是文章中有些部分写的还不够完整清晰,所以在此详细记录一下此算法理解过程。(理解此算法前应先明白使用 sqrt(num) 为判断条件判断素数的方法)
此算法产生的原因(定理):凡是大于5的素数一定与6的倍数相邻
相关证明过程可以去文章末尾的参考博客中查看
由定理可以直接写出算法:
#include<iostream>
#include<math.h>
using namespace std;bool isPrime(int num)
{if(num==2 || num==3 )return true; if(num%6!=1 && num%6!=5)return false;elsereturn true;
}int main(){//验证算法for(int i=2 ; i<=100 ; i++){if(isPrime(i))cout<<i<<"是素数"<<endl;elsecout<<i<<"不是素数"<<endl;}return 0;
}
运行一下程序,发现此算法是不完整的,
由此我们可以得出结论:凡是大于5的素数一定与6的倍数相邻,但与6的倍数相邻不一定是素数
想要完善此算法,先想一想为什么会把25、35、49等数判为素数呢?
我们通过分解25、35、49的因数发现这些数的共同点:都有因数与6的倍数相邻
例如:25的因数5,35的因数5、7,49的因数7
经过if判断后,剩下的数字都是与6的倍数相邻的数字
5、7、11、13、···、23、25、29、31、35、37、······
出现问题的原因就是:因为这些与6的倍数相邻的数字中有些数字是其他数字的因数
由此就可以写出完善的算法了:
#include<iostream>
#include<math.h>
using namespace std;bool isPrime(int num)
{if(num==2 || num==3 )return true; if(num%6!=1 && num%6!=5)return false;int tmp=sqrt(num);//步长为6的原因是,只需要判断该数是否有因数在6的倍数旁边 for(int i=5 ; i<=tmp ; i+=6 ) if(num%i==0 || num%(i+2)==0 ) //加2是因为与6的倍数相邻的数有两个 return false;return true;}int main(){for(int i=2 ; i<=100 ; i++){if(isPrime(i))cout<<i<<"是素数"<<endl;elsecout<<i<<"不是素数"<<endl;}return 0;
}
可以直接比较一下此算法与直接sqrt(num)的算法速度(测试数据量900万):
参考博客:判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路_huang_miao_xin的博客-CSDN博客_判断素数
判断素数(质数)高效算法相关推荐
- 判断素数/质数的快速算法
质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).--via维基百科 朴素算法: 1. def ...
- 判断素数的快速算法 sqrt()
我们在日常判断素数的程序中常用到如下代码 //判断数num是不是素数 for(i=2;i<num;i++){if(num%i==0)return 0;return 1; } 这样写无疑是没有问题 ...
- 判断素数的高效的方法
以前判断素数的方法是:将每个值传入一个函数,这个函数里面用 for循环判读是否为素数.这种方法的效率比较低,所以经过在网上查找资料和大佬的整理,出现里另外一种效率较高的判断素数的方法--孪生素数法. ...
- 大数据高效找所有素数/质数的算法
void sushu_filter(long count){ sz[1] = 0; for (long i = 2; i <= sqrt(count); i++) { if (sz[i] == ...
- acm素数判定 c语言,关于判断素数的一些算法
最近在hdu上A题 碰到些素数问题,记录下看到的算法. 一.筛选法 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2136 import java.io.B ...
- 【算法】素数(质数)判断方法
注:本篇文章已搬至个人博客中, 点击前往 素数(质数)的判断在算法问题中经常遇到,这里小结几种常用的判断方法. 素数(质数)的定义 首先,我们来看一下素数(质数)的定义:质数又称素数.一个大于1的自然 ...
- 判断素数———两种高效算法
相信大家在学习的过程中,时不时就会遇到判断素数的问题.今天就让我们来讨论讨论这个有趣的数学问题,看看如何更高效的来解决它吧! 在刚开始接触到这个问题时,我只想到了利用一个循环去在目标数的全部范围内一个 ...
- 【C语言】判断素数的算法从一般到高效
在刚开始学习使用C语言时,通过练习编程来提高对语法的思考是一个很不错的方法.判断素数是一个非常适合刚刚开始学习的我们练习的.下面我给大家简绍几种判断素数的方法及参考代码. 一.暴力方法 在数学中我们知 ...
- 素数(质数)判断方法
https://blog.csdn.net/songyunli1111/article/details/78690447 ->通俗易懂的解释 标准版:大部分人都知道的比较快的方法:判断从2到s ...
最新文章
- (C++) CSP 201803-1 跳一跳
- 单目相机的内外参标定
- 初级软件实作 - 星便笺 - 之二 - 富文本控件扩展
- mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?
- 深入解析Python中函数的参数与作用域
- 面试经历—广州YY(欢聚时代)
- Apple’s current market value is more than two trillion
- .NET 基础 一步步 一幕幕 [前言]
- VASP、Lammps快速上手神器——MedeA软件
- 工作那些事(十)谈谈技术主管(总监)
- Oracle 中文转拼音
- Activity子流程——调用子流程
- 以Skyline问题来看hard问题在面试的时候如何解决?
- NOIP模拟19/07/22
- VulnHub靶场系列:Flick
- Linux结构体变量报错,C语言中的结构体
- Suse12离线安装docker
- LIFT: Learned Invariant Feature Transform详细笔记
- 曙光服务器通过ipmi安装系统,曙光服务器ipmi部署记录.doc
- ps制作学校官网总结