<?php
var_dump(isPrime(0,1225));
/**
* [isPrime 求f范围内的质数]
* @param integer $small [范围最小值,默认0]
* @param integer $big [取值范围最大值]
* @return array [返回数组]
*/
function isPrime($small=0,$big){
if($small < 0 || $big< 1 || $big <= $small){
return 'error';
}
$array = array();
//创建一个数组,长度等于big, 默认值都是true
for( $i=1;$i<= $big;$i++){
//小于2和能除2的下标 的 值 均为false
if($i < 2 || $i %2==0){
$array[$i] =false;
}else{
$array[$i] =true;
}
}
/*
* 解析说明:
* 求能被x整数的数, 假设a乘以b等于x, 做则a和b 必有一个小于等于 x的平方根.
* 例如 36 分成4*9,6*6, 两个约数其中必有一个小于等于6
* 因此判断 x的约数,只需要除到 其平方根加1 如:查找36的约数,除到(6+1)即可 9不需要除,因为已经除以4
*/
//遍历所有的true,去掉能整除的
//第一个约数a: 从2开始,累加到(平方根+1)
//第二个约数, 从2到 (big/a)+1
//把a和b相乘的下标全部改成false
$ulimit = sqrt($big) + 1;//最大值的平方根+1
for($a=2; $a< $ulimit; $a++){
if($array[$a]){ //去掉false
//一个约数a,另一个就是$big/a,因此b的取值小于($big/a)+1
$temp = ($big/$a)+1 ;
for($b=2;$b<$temp;$b++)
{
$array[$a*$b] = false;
}
}
}
//定义返回的数组
$return = array();
//读取所有的true
foreach ($array as $key => $value) {
if($key > $small && $value){
$return[] =$key;
}
}
return $return;
}
?>