PHP算法之判断是否是质数

<h3>质数的定义</h3> <blockquote>质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。</blockquote> <h3>实现思路</h3> <p>循环所有可能的备选数字,然后和中间数以下且大于等于2的整数进行整除比较,如果能够被整数,则肯定不是质数,相反,就是质数。</p> <h3>第一种算法</h3> <p>这也是最可能先想到的,也就是直接和备选数的中间数去比较,算法源码如下:</p>
1/** 2 * 获取所有的质数 3 * @param array $arr 4 * @return array 5 */ 6function get_prime_number($arr = []) { 7 // 质数数组 8 $primeArr = []; 9 // 循环所有备选数 10 foreach ($arr as $value) { 11 // 备选数和备选数的中间数以下的数字整除比较 12 for ($i = 2; $i &lt;= 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 &lt;= floor($value / 2) 22 if ($value != 1 &amp;&amp; $i &gt; floor($value / 2)) { 23 $primeArr[] = $value; 24 } 25 } 26 return $primeArr; 27}
<p>### 第二种算法</p> <p>认真的来说的话,这也不算是另外一种算法,只是对于第一种的稍微点点优化,及中间最大数的优化,缩小比较范围,算法源码如下:</p>
1/** 2 * 获取所有的质数 3 * @param array $arr 4 * @return array 5 */ 6function get_prime_number($arr = []) { 7 // 质数数组 8 $primeArr = []; 9 // 循环所有备选数 10 foreach ($arr as $value) { 11 // 备选数和备选数的中间数以下的数字整除比较 12 for ($i = 2; $i &lt;= 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 &lt;= floor($value / $i) 22 if ($value != 1 &amp;&amp; $i &gt; floor($value / $i)) { 23 $primeArr[] = $value; 24 } 25 } 26 return $primeArr; 27}
<h3>第三种算法</h3> <p>这个的话也是对于第二种的优化,即,直接从完整数组中删除所有不是质数的数即可,算法源码如下:</p>
1/** 2 * 获取所有的质数 3 * @param array $arr 4 * @return array 5 */ 6function get_prime_number_three($arr = []) { 7 // 质数数组 8 $primeArr = $arr; 9 // 循环所有备选数 10 foreach ($primeArr as $key =&gt; $value) { 11 if ($value == 1) { 12 unset($primeArr[$key]); 13 continue; 14 } 15 // 备选数和备选数的中间数以下的数字整除比较 16 for ($i = 2; $i &lt;= 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}
<h3>使用方法</h3> <p>比如,求1-100的所有质数</p>
1// 所有备选数数组 2$numberArr = range(1, 100, 1); 3// 获取备选数中的所有质数 4$primeNumberArr = get_prime_number($numberArr); 5// 输出打印 6print_r($primeNumberArr);
<p>又比如,求指定数组中的所有质数</p>
1// 所有备选数数组 2$numberArr = [11, 22, 33, 66, 77, 3, 8, 10, 99]; 3// 获取备选数中的所有质数 4$primeNumberArr = get_prime_number($numberArr); 5// 输出打印 6print_r($primeNumberArr);
<h3>最后</h3> <p>如有说的不对的地方,请大家多多谅解,欢迎留言和我沟通、交流,谢谢!</p>

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

点赞
收藏

评论区

加载中...

相关推荐

python百题大冲关-Fizz Buzz 经典问题

挑战介绍给定一个整数num,从1到num按照下面的规则返回每个数:如果这个数被3整除,返回'Fizz'。如果这个数被5整除,返回'Buzz'。如果这个数能同时被3和5整除,返回'FizzBuzz'。如果这个数既不能被3也不能被5整除,返回这个数字的字符串格式。挑战内容

用Python编程语言来实现阿姆斯特朗数的检查

一、什么是阿姆斯特朗数?如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。一个正整数称为阿姆斯特朗阶数。例:abcd...anbncndn...如果是3位的阿姆斯特朗数字,则每个数字的立方和等于该数字本身。例如:153111555333//153是一个阿姆斯特朗

用Python编程语言来实现阿姆斯特朗数的检查

一、什么是阿姆斯特朗数?如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。一个正整数称为阿姆斯特朗阶数。例:abcd...anbncndn...如果是3位的阿姆斯特朗数字,则每个数字的立方和等于该数字本身。例如:153111555333//153是一个阿姆斯特朗数。二、案

人工智能数学基础6:无穷大和无穷小的大小比较以及斯特林公式

1.无穷大的大小排列n、a1、a2、a3为自然数(表述为n∈N),n趋于无穷大(n→∞),a1、a2、a3大于1,则下列实数的大小排列为:2\.无穷小的大小排列将无穷大的大小排列公式中比较的数字作为分母,1作为分子,大于号改为小于号,则可以作为无穷小大小排列公式:3.极限值n为自然数(表述为n∈N),n趋于无穷大(n→∞),a2、a3大于1,则

Openssl生成RSA公私钥以及将公钥转换成C#支持的格式

Openssl生成RSA公私钥以及将公钥转换成C支持的格式1.RSA算法介绍RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e、d。其中,n是两个大质数p、q的积,n被称为模数,n的二进

HBase数据同步到ElasticSearch的方案

<divid"article\_content"class"article\_content"<p<br</p<h3ElasticSearch的River机制</h3<pElasticSearch自身提供了一个River机制,用于同步数据。</p<p这里能够找到官方眼下推荐的River:</p<p<atarget

PHP算法之判断是否是质数 - HelloWorld