質數又稱素數。一個大于1的自然數,除了1和它自身外,不能整除其他自然數的數叫做質數;否則稱為合數。
實現思路循環所有可能的備選數字,然后和中間數以下且大于等于2的整數進行整除比較,如果能夠被整數,則肯定不是質數,相反,就是質數。
第一種算法這也是最可能先想到的,也就是直接和備選數的中間數去比較,算法源碼如下:
/** * 獲取所有的質數 * @param array $arr * @return arrayfunction get_prime_number($arr = []) { // 質數數組 $primeArr = []; // 循環所有備選數 foreach ($arr as $html' target='_blank'>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 arrayfunction 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 arrayfunction 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);
以上就是php如何判斷一個數是否是質數的三種方法的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答