求100之內的素質並輸出 最優演算法 PHP面試題

2022-03-13 16:22:36 字數 1533 閱讀 5323

曾經第一次面試題中的題目, 今天碰巧看到整理一下 

當時用了最基本的演算法寫出來了, 兩個for迴圈, 乙個乙個取餘, 是質數就放進結果陣列中

**如下, 檢查**執行時間的**是來對比三種不同演算法的優劣性

演算法一: 每個數都從2開始除,  除遍所有比自己小的整數, 如果有能整除的, 說明不是質數, 退出本次迴圈, 進行下一次迴圈

function

test()

}if($mark != 1)

}echo "";

print_r($array

);

echo "

";

echo

microtime(true)-$start

;}

面試官看了後讓我優化一下演算法, 當時我的**連break好像都沒有,  然後我就加了句break, 然後信心滿滿的看著他,  

哈哈, 然後你可以想象下他的表情了~

不過, 他人還挺好, 告訴我並不需要每次都除到比自己小1的那個數, 我第一反應是除到一般就夠了,

然後他說, 除到這個數的平方根就可以了, 比如17除到4就行了, 因為當除數超過平方根後, 再除只是把商和除數的位置顛倒了而已, 是一種重複

演算法二: 除了把第二個for迴圈中的$i 換成 sqrt($i) 之外基本沒什麼變化

function

test1()

}if($mark != 1)

}//echo "";

// print_r($array);

echo "

";

echo

microtime(true)-$start

;}

當然還有一種演算法,  質數是什麼? 非質數是什麼? 

質數就是除了自己和1 之外不能被任何數整除,  非質數就是合數,  而合數則肯定可以由質數相乘得到.

通過這個規則, 我們就可以只檢查$i  是否可以整除比自己小的質數了, 非質數可以丟掉不管了.(此時的效率還不如演算法二高)

還可以再結合演算法二, 只檢查比$i平方根小的質數, (這時的效率就比演算法二高了)

演算法三: 這種演算法效率最高

function

test2()

//foreach迴圈佇列, 如果能整除佇列中的質數, 則說明$i不是質數, 應該立刻跳出迴圈

if(($i % $value) === 0)

}if($mark != 1)

}//echo "";

// print_r($queue);

echo "

";

echo

microtime(true)-$start

;}

你可以依次執行

test();

test1();

test2();

來檢查結果和**執行時間,  執行前請根據需要開啟或者關閉注釋

求100之內的素數

題目 求100之內的素數 程式分析 判斷素數的方法 用乙個數分別去除2到 sqrt 這個數 如果能被整除,則表明此數不是素數,反之是素數。1 package com.li.fiftyalgorthm 23 4 題目 判斷101 200之間有多少個素數,並輸出所有素數。5 程式分析 判斷素數的方法 用...

篩法求素數 求100之內的素數

素數 定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。篩法求素數,需要對素數和非素數做出不同的標記,或者只標記非素數 素數 現用0標記非素數,素數不標記。引用陣列,使0 100與陣列元素一 一相對應 0即a 0 1即a 1 2即a 2 注意特例,1 即a 1 不是素數,首先標記為0 剩下...

用篩選法求100之內的素數

所謂篩選法,指的是 埃拉託色尼篩法 採取的方法是,在一張紙上寫上1 100 全部的整數 然後逐個判斷他們是否為素數,找出乙個非素數,就把他挖掉,最後剩下的就是素數 具體做法如下所示 先把1挖掉,因為1不是素數 用2除它後面的各個數,能把2整除的數挖掉,即就是把2的倍數挖掉 用3除它後面的各個數,把3...