转载自:https://blog.csdn.net/m0_37586991/article/details/79673837?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

判断一个数是否为质数/素数——从普通判断算法到高效判断算法思路

因为看了上面这篇文章,感觉思路很棒,但原文是用C++写的,所以想写个python的版本。本文的大体结构与原文类似。

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

1)直观判断法

最直观的方法,根据定义,因为质数除了1和本身之外没有其他约数,所以判断n是否为质数,根据定义直接判断从2到n-1是否存在n的约数即可。
  1. def isPrime(num):
  2. for i in range(num):
  3. for j in range(2, num):
  4. if i % j == 0:
  5. break
  6. else:
  7. return True

2)直观判断法改进

上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。
  1. from math import sqrt
  2. def isPrime(num):
  3. for i in range(num):
  4. for j in range(2, int(sqrt(num))):
  5. if i % j == 0:
  6. break
  7. else:
  8. return True

3)质数规律判断法

首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

证明:令x≥1,将大于等于5的自然数表示如下:

······6x-2,6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6x+6,6x+7······

也就是

······2(3x-1),6x-1,6x,6x+1,2(3x+1),3(2x+1),2(3x+2),6x+5,6(x+1),6(x+1)+1······

可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。

根据以上规律,判断质数可以6个为单元快进,即将方法(2)循环中i++步长加大为6,加快判断速度,代码如下:
  1. from math import sqrt
  2. def isPrime(num):
  3. if num == 2 or num == 3: # 两个较小的数进行处理
  4. return True
  5. if num % 6 != 1 and num % 6 != 5: # 不在6的倍数的两侧的一定不是质数
  6. return False
  7. tmp = int(sqrt(num))
  8. for i in range(5, tmp+1): # 在6的倍数两侧的也可能不是质数
  9. if num % i == 0 or num % (i+2) == 0:
  10. return False
  11. return True # 剩下的全是质数
调用函数的代码如下:
  1. for i in range(2, 200): # 这里的range函数起始值必须为2,否则第3种方法运行时会把1当作质数输出
  2. if isPrime(i):
  3. print(i, end=' ')

方法三正确写法

from math import sqrt
def is_prime(n):if n <= 3:return n > 1#因为6的倍数+2可以被2整除,6的倍数+3可以被3整除,6的倍数+4可以被2整除,6的倍数可以被6整除#所以只有n = 6的倍数+1或者+5才有可能是素数if n%6 != 1 and n%6 != 5:return False#除此之外,还要判断该数可否被6的倍数+1或者+5整除#比如25虽然在24(4*6)的右边,但它可以被5(0+5)整除#比如49虽然在48(8*6)的右边,但它可以被7(6+1)整除for i in range(5,int(sqrt(n) + 1),6):if n%i == 0 or n%(i+2) == 0:return False  return True

判断一个数是否为质数的三种方法相关推荐

  1. python脚本判断一个数是否为素数的几种方法

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  2. python中判断一个数是否为素数_【转载】Python脚本判断一个数是否为素数的几种方法...

    质数又称素数.指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.素数在数论中有着很重要的地位.比1大但不是素数的数称为合数.1和0既非素数也非合数.质数是与合数相对立的两个概念 ...

  3. C语言中三个数比较大小详解——三种方法

    ​ C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...

  4. php100以内质数求和,100以内的质数_PHP质数计算三种方法 php求100以内的质数

    摘要 腾兴网为您分享:PHP质数计算三种方法 php求100以内的质数,自动刷宝,长沙银行,猿辅导,愈加等软件知识,以及cf一键刷枪,业主名录采集软件,卡乐光电,魔方虚拟光驱,掌上徐州,卡农社区,fa ...

  5. jQuery判断复选框是否选中的三种方法

    jQuery判断复选框是否选中的三种方法. PS:下面的代码为通过循环找到在多个复选框中被选中的复选框,并对其删除 //判断复选框是否选中的第一种方法: $.each(buttons,function ...

  6. Angular Js 判断对象不为空对象的三种方法

    前言 在写前端时,很多时候都需要去校验后端返回的数据是否是个空对象.这里就介绍三种方法 第一种 //将json对象转化为json字符串,再判断该字符串是否为"{}" JSON.st ...

  7. Javascript 判断一个数是否为素数的三种解法

    判断一个数是否为素数(质数):只能被1和其本身整除的数. 方案一:只有两个因子 (计算因子的个数是否是2,如果是2,是素数) 方案二:因子之和  ==  该数 + 1 方案三:通过一个开关控制该数是否 ...

  8. Java技巧分享:判断字符串是否为空常的三种方法

    很多初学Java的小伙伴肯定都有遇到过需要判断一个字符串是否为空的情况,那么你知道应该如何实现吗?今天小千就来给大家介绍三种不同的方式,同学们看一下哪个适合自己. 判断字符串是否为空有三种常见的方法分 ...

  9. jquery判断方法是否存在_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

最新文章

  1. CentOS 查看IP,端口 修改IP,打开端口生效
  2. Java 文件压缩与解压缩
  3. AF_UNIX和AF_INET
  4. MVC模式 与 Model2模型 介绍
  5. promehteus 监控超时_使用 Prometheus Operator 监控 Kubernetes Etcd
  6. 全面解读新中产:有房有车有贷、半数决策看老婆
  7. 【C 语言提高、进阶】Day 3
  8. 【开源】一个有趣的文字冒险游戏
  9. matlab中产生对角阵,关于matlab中的diag函数(矩阵对角元素的提取和创建对角阵)
  10. sql数据库置疑解决办法
  11. Maya及UE4的 ART相关
  12. vue.config.js跨域配置
  13. linux的dd命令与cp,dd命令中seek和skip的用法-Linux下挂载 windows 共享的命令-学习history命令的使用方法_169IT.COM...
  14. 使用netron对mnist网络结构分析
  15. 微信小程序入门之常用组件(04)
  16. android 画图一
  17. Excel报:文件已损坏无法打开错误问题解决
  18. 基于EasyNVR实现RTSP_Onvif监控摄像头Web无插件化直播监控
  19. java软件工程师自我评价_java软件工程师自我评价简历范文
  20. 阿泡的产品管理工具包之产品经理的34个感想

热门文章

  1. linux的批处理文件怎么写,Linux下批处理文件编写
  2. GCF(4)----手机认证相关知识
  3. 如何通过命令将可执行程序转入deamon(之start-stop-daemon )
  4. 【时光纪念】愿有岁月可回头
  5. 论一个程序员的编程修养(你品,你细品)
  6. Matlab App Designer 学习笔记
  7. 《 iOS-checkIPA 》ipa 文件信息检查工具
  8. (三)Linux 4G模块实现短信发送的两种格式(Text和PDU)
  9. 如何在Python中四舍五入数字
  10. SpringCloud Netflix-Eureka使用