质数的定义

质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。

实现思路

循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能够被整数,则肯定不是质数,相反,就是质数。

第一种算法

这也是最可能先想到的,也就是直接和备选数的中间数去比较,算法源码如下:


  1. /**
  2. * 获取所有的质数
  3. * @param array $arr
  4. * @return array
  5. */
  6. function get_prime_number($arr = []) {
  7. // 质数数组
  8. $primeArr = [];
  9. // 循环所有备选数
  10. foreach ($arr as $value) {
  11. // 备选数和备选数的中间数以下的数字整除比较
  12. for ($i = 2; $i <= floor($value / 2); $i++) {
  13. // 能够整除,则不是质数,退出循环
  14. if ($value % $i == 0) {
  15. break;
  16. }
  17. }
  18. // 被除数$j比备选数的中间数大的则为质数
  19. // 这样判断的依据:
  20. // 假如备选数为质数,则内层的for循环不会break退出,则执行完毕,$i会继续+1,即最后$i = floor($value / 2) + 1
  21. // 假如备选数不为质数,则内层的for循环遇到整除就会break退出,$i不会继续+1,即最后$i <= floor($value / 2)
  22. if ($value != 1 && $i > floor($value / 2)) {
  23. $primeArr[] = $value;
  24. }
  25. }
  26. return $primeArr;
  27. }

### 第二种算法

认真的来说的话,这也不算是另外一种算法,只是对于第一种的稍微点点优化,及中间最大数的优化,缩小比较范围,算法源码如下:


  1. /**
  2. * 获取所有的质数
  3. * @param array $arr
  4. * @return array
  5. */
  6. function get_prime_number($arr = []) {
  7. // 质数数组
  8. $primeArr = [];
  9. // 循环所有备选数
  10. foreach ($arr as $value) {
  11. // 备选数和备选数的中间数以下的数字整除比较
  12. for ($i = 2; $i <= floor($value / $i); $i++) {
  13. // 能够整除,则不是质数,退出循环
  14. if ($value % $i == 0) {
  15. break;
  16. }
  17. }
  18. // 被除数$j比备选数的中间数大的则为质数
  19. // 这样判断的依据:
  20. // 假如备选数为质数,则内层的for循环不会break退出,则执行完毕,$i会继续+1,即最后$i = floor($value / $i) + 1
  21. // 假如备选数不为质数,则内层的for循环遇到整除就会break退出且$i不会继续+1,即最后$i <= floor($value / $i)
  22. if ($value != 1 && $i > floor($value / $i)) {
  23. $primeArr[] = $value;
  24. }
  25. }
  26. return $primeArr;
  27. }

第三种算法

这个的话也是对于第二种的优化,即,直接从完整数组中删除所有不是质数的数即可,算法源码如下:


  1. /**
  2. * 获取所有的质数
  3. * @param array $arr
  4. * @return array
  5. */
  6. function get_prime_number_three($arr = []) {
  7. // 质数数组
  8. $primeArr = $arr;
  9. // 循环所有备选数
  10. foreach ($primeArr as $key => $value) {
  11. if ($value == 1) {
  12. unset($primeArr[$key]);
  13. continue;
  14. }
  15. // 备选数和备选数的中间数以下的数字整除比较
  16. for ($i = 2; $i <= floor($value / $i); $i++) {
  17. // 能够整除,则不是质数,从数组中删除且退出循环
  18. if ($value % $i == 0) {
  19. unset($primeArr[$key]);
  20. break;
  21. }
  22. }
  23. }
  24. // 重置数组索引返回
  25. return array_values($primeArr);
  26. }

使用方法

比如,求1-100的所有质数


  1. // 所有备选数数组
  2. $numberArr = range(1, 100, 1);
  3. // 获取备选数中的所有质数
  4. $primeNumberArr = get_prime_number($numberArr);
  5. // 输出打印
  6. print_r($primeNumberArr);

又比如,求指定数组中的所有质数


  1. // 所有备选数数组
  2. $numberArr = [11, 22, 33, 66, 77, 3, 8, 10, 99];
  3. // 获取备选数中的所有质数
  4. $primeNumberArr = get_prime_number($numberArr);
  5. // 输出打印
  6. print_r($primeNumberArr);

最后

如有说的不对的地方,请大家多多谅解,欢迎留言和我沟通、交流,谢谢!

原文地址:https://segmentfault.com/a/1190000016442947

PHP算法之判断是否是质数的更多相关文章

  1. C#算法之判断一个字符串是否是对称字符串

    记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...

  2. Python 判断是否为质数或素数

    一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数. 首先我们来第一个传统的判断思路: def handl ...

  3. python判断是否是质数

    质数:只能被1和它自身整除 # 获取用户输入的数,判断是否是质数 num = int(input('输入一个任意的大于1的整数:')) i=2 # 创建一个变量,记录是否是质数,默认num是质数 fl ...

  4. Java实现 蓝桥杯 算法提高 判断名次

    算法提高 判断名次 时间限制:1.0s 内存限制:256.0MB 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头---_-!)得了第1名的人23 ...

  5. 算法——dfs 判断是否为BST

    95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值 ...

  6. NX二次开发-算法篇-判断找到两个数组里不相同的对象

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...

  7. HDOJ-3416(最大流+最短路+ISAP算法+向前星dijikstra算法+如何判断一条边是否在最短路中)

    Marriage Match IV HDOJ-3416 这题的题意就是要找两点之间最短路的路径个数,而且边不能重复. 最大流和最短路的结合.首先正向和反向建图,再跑两遍dijikstra.到这里就求出 ...

  8. 武汉科技大学ACM:1010: 零起点学算法27——判断是否直角三角形

    Problem Description 输入三个整数,分别代表三角形的三条边长度,判断能否构成直角三角形 Input 输入3个整数a,b,c(多组数据,-5000000<a,b,c<500 ...

  9. 武汉科技大学ACM :1002: 零起点学算法28——判断是否闰年

    Problem Description 输入年份,判断是否闰年 Input 输入一个整数n(多组数据) Output 如果是闰年,输出yes,否则输出no(每组数据一行) Sample Input 2 ...

随机推荐

  1. VMware 12安装CentOS 6.9时出现:The centos disc was not found in any of your drives.Please insert the centos disc and press OK to retry

    错误: The centos disc was not found in any of your drives.Please insert the centos disc and press OK t ...

  2. 沁园春&#183;咏史

    沁园春·咏史 文/天地尘埃2020 谁是谁非?宋桧连金,武穆饮生. 叹止渴饮鸩.灰飞烟灭:诵传千载:长跪无声. 懿旨朱批?直书秉笔?天地一根秤自衡. 何曾忘! 这英雄千古,犹恨空横! 幽幽何觅忠魂.耻 ...

  3. 自己定义UISlider的样式和滑块

    //自己定义UISlider的样式和滑块 //轨道图片 UIImage *stetchLeftTrack = [UIImage imageNamed:@"thick"]; UIIm ...

  4. Android 怎样实现 焦点图的 无线循环滑动的状态?

    參考网址:http://my.oschina.net/xsk/blog/119167 总体的架构:ViewPgaer 中直接嵌套  IamgeView 方案一:  重写Viewpager 这样有局限性 ...

  5. 基础树形DP小结

    HDU 4044 Geodefense http://blog.csdn.net/zmx354/article/details/25109897 树形DP暂且先告一段落了. HDU 3586 Info ...

  6. 不使用系统自带的button

    // //  LKTitleBtn.m //  01-彩票 // //  Created by Lenny  on 3/17/15. //  Copyright (c) 2015 Lenny. All ...

  7. Windows下Go语言LiteIDE下载及安装

    下载地址为 https://www.golangtc.com/download/liteide  我下载的是liteidex32.1windows-qt4.zip,下载之后解压,并将liteide文件 ...

  8. ClassLoader.getResourceAsStream(name);获取配置文件的方法

    ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+" ...

  9. 解决PopupWindow的阴影覆盖问题

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/108 PopupWindow阴影覆盖问题 最近这段时间需求 ...

  10. TopN问题(分别使用Hadoop和Spark实现)

    简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在map阶 ...