最近看到一篇高效的素数判断算法文章,但是文章中有些部分写的还不够完整清晰,所以在此详细记录一下此算法理解过程。(理解此算法前应先明白使用 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博客_判断素数

判断素数(质数)高效算法相关推荐

  1. 判断素数/质数的快速算法

    质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).--via维基百科 朴素算法: 1. def ...

  2. 判断素数的快速算法 sqrt()

    我们在日常判断素数的程序中常用到如下代码 //判断数num是不是素数 for(i=2;i<num;i++){if(num%i==0)return 0;return 1; } 这样写无疑是没有问题 ...

  3. 判断素数的高效的方法

    以前判断素数的方法是:将每个值传入一个函数,这个函数里面用 for循环判读是否为素数.这种方法的效率比较低,所以经过在网上查找资料和大佬的整理,出现里另外一种效率较高的判断素数的方法--孪生素数法. ...

  4. 大数据高效找所有素数/质数的算法

    void sushu_filter(long count){ sz[1] = 0; for (long i = 2; i <= sqrt(count); i++) { if (sz[i] ==  ...

  5. acm素数判定 c语言,关于判断素数的一些算法

    最近在hdu上A题 碰到些素数问题,记录下看到的算法. 一.筛选法 题目:http://acm.hdu.edu.cn/showproblem.php?pid=2136 import java.io.B ...

  6. 【算法】素数(质数)判断方法

    注:本篇文章已搬至个人博客中, 点击前往 素数(质数)的判断在算法问题中经常遇到,这里小结几种常用的判断方法. 素数(质数)的定义 首先,我们来看一下素数(质数)的定义:质数又称素数.一个大于1的自然 ...

  7. 判断素数———两种高效算法

    相信大家在学习的过程中,时不时就会遇到判断素数的问题.今天就让我们来讨论讨论这个有趣的数学问题,看看如何更高效的来解决它吧! 在刚开始接触到这个问题时,我只想到了利用一个循环去在目标数的全部范围内一个 ...

  8. 【C语言】判断素数的算法从一般到高效

    在刚开始学习使用C语言时,通过练习编程来提高对语法的思考是一个很不错的方法.判断素数是一个非常适合刚刚开始学习的我们练习的.下面我给大家简绍几种判断素数的方法及参考代码. 一.暴力方法 在数学中我们知 ...

  9. 素数(质数)判断方法

    https://blog.csdn.net/songyunli1111/article/details/78690447  ->通俗易懂的解释 标准版:大部分人都知道的比较快的方法:判断从2到s ...

最新文章

  1. (C++) CSP 201803-1 跳一跳
  2. 单目相机的内外参标定
  3. 初级软件实作 - 星便笺 - 之二 - 富文本控件扩展
  4. mysql怎样循环插入数据_你向 Mysql 数据库插入 100w 条数据用了多久?
  5. 深入解析Python中函数的参数与作用域
  6. 面试经历—广州YY(欢聚时代)
  7. Apple’s current market value is more than two trillion
  8. .NET 基础 一步步 一幕幕 [前言]
  9. VASP、Lammps快速上手神器——MedeA软件
  10. 工作那些事(十)谈谈技术主管(总监)
  11. Oracle 中文转拼音
  12. Activity子流程——调用子流程
  13. 以Skyline问题来看hard问题在面试的时候如何解决?
  14. NOIP模拟19/07/22
  15. VulnHub靶场系列:Flick
  16. Linux结构体变量报错,C语言中的结构体
  17. Suse12离线安装docker
  18. LIFT: Learned Invariant Feature Transform详细笔记
  19. 曙光服务器通过ipmi安装系统,曙光服务器ipmi部署记录.doc
  20. ps制作学校官网总结

热门文章

  1. postman的命令执行工具--newman
  2. 消息队列应用与原理剖析
  3. python求梯形面积_pythonocc 求一条直线与一个梯形的交点的横坐标
  4. 用NSIS制作安装文件
  5. 逼近理想解法TOPSIS(python程序)
  6. SaaS-HRM企业管理
  7. Matlab中遇到~=
  8. SVN认证失败及“在其上下文中,该请求地址无效”问题的解决方法
  9. ethereum-etl拉取以太坊数据
  10. html求正方形面积,利用js计算正方形的面积的方法介绍