素数的定义也叫素数。大于1的自然数,除了1和它本身不能整除其他自然数,称为素数;否则称为合数。实现循环所有可能的候选数的思想,然后与中间数以下且大于等于2的整数进行整除比较。如果能为整数,则肯定不是质数,反之,这是一个素数。第一种算法也是最先想到的,也就是直接和备选数的中间数比较。算法源码如下:/***获取所有素数*@paramarray$arr*@returnarray*/functionget_prime_number($arr=[]){//素数数组$primeArr=[];//循环遍历所有备选数foreach($arras$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<=floor($value/2)最后$i不会继续+1if($value!=1&&$i>floor($value/2)){$primeArr[]=$value;}}返回$primeArr;}###如果第二种算法是认真的,这不是另一种算法。只是对第一个稍微优化一下,中间最大数的优化,缩小比较范围。算法源码如下:/***获取所有素数*@paramarray$arr*@returnarray*/functionget_prime_number($arr=[]){//素数数组$primeArr=[];//遍历所有备选数字foreach($arras$value){//备选数与备选数中间数以下数的整除性比较for($i=2;$i<=floor($value/$i);$i++){//如果可以整除,则不是质数,退出循环if($value%$i==0){break;}}//如果被除数$j大于备选数的中间数,则为质数//判断依据://如果备选数为质数,则内层for循环不会break退出,执行完后,$i会继续+1,即finally$i=floor($value/$i)+1//如果候选数不是质数,则内层for循环遇到整数除法会break退出,$i不会继续+1,即最后的$i<=floor($value/$i)if($value!=1&&$i>floor($value/$i)){$primeArr[]=$value;}}return$primeArr;}第三个算法也是对第二个的优化,即直接删除所有不是素数的数就可以了,算法源码如下:/***get所有素数*@paramarray$arr*@returnarray*/functionget_prime_number_three($arr=[]){//素数数组$primeArr=$arr;//遍历所有备选方案foreach($primeArras$key=>$value){if($value==1){unset($primeArr[$key]);继续;}//Alternativesandprime选中数中间数以下的数可整除比较for($i=2;$i<=floor($v值/$i);$i++){//如果可整除,则不是质数,将其从数组中删除并退出循环if($value%$i==0){unset($primeArr[$key]);休息;}}}//重置数组索引并返回returnarray_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);最后,如果有什么不对的地方还请见谅,欢迎留言与我交流,谢谢!
