PHP算法之判断是否是质数
质数的定义
质数又称素数。一个大于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算法之判断是否是质数的更多相关文章
- C#算法之判断一个字符串是否是对称字符串
记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...
- Python 判断是否为质数或素数
一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除(2, 3, 5, 7等),换句话说就是该数除了1和它本身以外不再有其他的因数. 首先我们来第一个传统的判断思路: def handl ...
- python判断是否是质数
质数:只能被1和它自身整除 # 获取用户输入的数,判断是否是质数 num = int(input('输入一个任意的大于1的整数:')) i=2 # 创建一个变量,记录是否是质数,默认num是质数 fl ...
- Java实现 蓝桥杯 算法提高 判断名次
算法提高 判断名次 时间限制:1.0s 内存限制:256.0MB 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头---_-!)得了第1名的人23 ...
- 算法——dfs 判断是否为BST
95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值 ...
- NX二次开发-算法篇-判断找到两个数组里不相同的对象
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...
- HDOJ-3416(最大流+最短路+ISAP算法+向前星dijikstra算法+如何判断一条边是否在最短路中)
Marriage Match IV HDOJ-3416 这题的题意就是要找两点之间最短路的路径个数,而且边不能重复. 最大流和最短路的结合.首先正向和反向建图,再跑两遍dijikstra.到这里就求出 ...
- 武汉科技大学ACM:1010: 零起点学算法27——判断是否直角三角形
Problem Description 输入三个整数,分别代表三角形的三条边长度,判断能否构成直角三角形 Input 输入3个整数a,b,c(多组数据,-5000000<a,b,c<500 ...
- 武汉科技大学ACM :1002: 零起点学算法28——判断是否闰年
Problem Description 输入年份,判断是否闰年 Input 输入一个整数n(多组数据) Output 如果是闰年,输出yes,否则输出no(每组数据一行) Sample Input 2 ...
随机推荐
- 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 ...
- 沁园春·咏史
沁园春·咏史 文/天地尘埃2020 谁是谁非?宋桧连金,武穆饮生. 叹止渴饮鸩.灰飞烟灭:诵传千载:长跪无声. 懿旨朱批?直书秉笔?天地一根秤自衡. 何曾忘! 这英雄千古,犹恨空横! 幽幽何觅忠魂.耻 ...
- 自己定义UISlider的样式和滑块
//自己定义UISlider的样式和滑块 //轨道图片 UIImage *stetchLeftTrack = [UIImage imageNamed:@"thick"]; UIIm ...
- Android 怎样实现 焦点图的 无线循环滑动的状态?
參考网址:http://my.oschina.net/xsk/blog/119167 总体的架构:ViewPgaer 中直接嵌套 IamgeView 方案一: 重写Viewpager 这样有局限性 ...
- 基础树形DP小结
HDU 4044 Geodefense http://blog.csdn.net/zmx354/article/details/25109897 树形DP暂且先告一段落了. HDU 3586 Info ...
- 不使用系统自带的button
// // LKTitleBtn.m // 01-彩票 // // Created by Lenny on 3/17/15. // Copyright (c) 2015 Lenny. All ...
- Windows下Go语言LiteIDE下载及安装
下载地址为 https://www.golangtc.com/download/liteide 我下载的是liteidex32.1windows-qt4.zip,下载之后解压,并将liteide文件 ...
- ClassLoader.getResourceAsStream(name);获取配置文件的方法
ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+" ...
- 解决PopupWindow的阴影覆盖问题
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/108 PopupWindow阴影覆盖问题 最近这段时间需求 ...
- TopN问题(分别使用Hadoop和Spark实现)
简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在map阶 ...