质数的定义

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

实现思路

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

第一种算法

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


/**
* 获取所有的质数
* @param array $arr
* @return array
*/
function get_prime_number($arr = []) {
// 质数数组
$primeArr = [];
// 循环所有备选数
foreach ($arr as $value) {
// 备选数和备选数的中间数以下的数字整除比较
for ($i = 2; $i <= floor($value / 2); $i++) {
// 能够整除,则不是质数,退出循环
if ($value % $i == 0) {
break;
}
}
// 被除数$j比备选数的中间数大的则为质数
// 这样判断的依据:
// 假如备选数为质数,则内层的for循环不会break退出,则执行完毕,$i会继续+1,即最后$i = floor($value / 2) + 1
// 假如备选数不为质数,则内层的for循环遇到整除就会break退出,$i不会继续+1,即最后$i <= floor($value / 2)
if ($value != 1 && $i > floor($value / 2)) {
$primeArr[] = $value;
}
}
return $primeArr;
}

### 第二种算法

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


/**
* 获取所有的质数
* @param array $arr
* @return array
*/
function get_prime_number($arr = []) {
// 质数数组
$primeArr = [];
// 循环所有备选数
foreach ($arr as $value) {
// 备选数和备选数的中间数以下的数字整除比较
for ($i = 2; $i <= floor($value / $i); $i++) {
// 能够整除,则不是质数,退出循环
if ($value % $i == 0) {
break;
}
}
// 被除数$j比备选数的中间数大的则为质数
// 这样判断的依据:
// 假如备选数为质数,则内层的for循环不会break退出,则执行完毕,$i会继续+1,即最后$i = floor($value / $i) + 1
// 假如备选数不为质数,则内层的for循环遇到整除就会break退出且$i不会继续+1,即最后$i <= floor($value / $i)
if ($value != 1 && $i > floor($value / $i)) {
$primeArr[] = $value;
}
}
return $primeArr;
}

第三种算法

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


/**
* 获取所有的质数
* @param array $arr
* @return array
*/
function get_prime_number_three($arr = []) {
// 质数数组
$primeArr = $arr;
// 循环所有备选数
foreach ($primeArr as $key => $value) {
if ($value == 1) {
unset($primeArr[$key]);
continue;
}
// 备选数和备选数的中间数以下的数字整除比较
for ($i = 2; $i <= floor($value / $i); $i++) {
// 能够整除,则不是质数,从数组中删除且退出循环
if ($value % $i == 0) {
unset($primeArr[$key]);
break;
}
}
}
// 重置数组索引返回
return array_values($primeArr);
}

使用方法

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


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

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


// 所有备选数数组
$numberArr = [11, 22, 33, 66, 77, 3, 8, 10, 99];
// 获取备选数中的所有质数
$primeNumberArr = get_prime_number($numberArr);
// 输出打印
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. java 数组中求最值

    java中数组求最值,这在实际的开发中差点儿用不到,可是在面试中会偶尔被问到,这是考你主要的思维能力,如今说下这个题的基本思路 思路: 1:先定义一个变量,通常是用数组的第一个值 2:在循环中推断(从 ...

  2. Sublime Text 2 SFTP UnicodeDecodeError错误!

    右键-->SFTP/FTP ->Sync Remote To Local {作者:半条虫(466814195)} 提示下面错误 An unexpected error occurred, ...

  3. luogu3376 【模板】 网络最大流

    题目大意 给出一个网络图,以及其源点和汇点,求出其网络最大流. 概念 可以把网络图看作管道,节点看作管道的交界处.流就像是管道里的流水.管道有个容量(相当于横截面积),还会有个流量(相当于水流占了管道 ...

  4. 有什么springMVC+myBatis的书?

    最近在看MyBatis,把我最近看的东西给你整理一下吧. 书籍:深入浅出MyBatis技术原理与实战 下载地址:[免费]深入浅出MyBatis技术原理与实战.pdf-CSDN下载 MyBatis 相关 ...

  5. Linux - xshell 链接CentOS 设置高亮

    默认是黑白的! 用了vim 指令还是黑白的. 两种途径设置,一种是通过Alt+P. 一种是选择配色方案来设置.

  6. 【Codeforces 258D】 Count Good Substrings

    [题目链接] http://codeforces.com/contest/451/problem/D [算法] 合并后的字符串一定是形如"ababa","babab&qu ...

  7. Juniper路由器

    Juniper路由器入门之一:需要子接口的端口配置 set interfaces fe-2/0/1 vlan-tagging              ――――在配置接口启用封装VLAN set in ...

  8. NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并

    思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...

  9. 6.Renderer Window

    渲染是实时的,所见即所得.同时还可以输出一些统计信息. Pixel Snoop:获取颜色值,同时把该值复制到剪贴板,主要用户是获取颜色值 Wireframe:开启后可以查看3D节点图形骨架 Stati ...

  10. Dictionary 小知识

    Dictionary<string, string>是一个泛型 他本身有集合的功能有时候可以把它看成数组 他的结构是这样的:Dictionary<[key], [value]> ...