曾經第一次面試題中的題目, 今天碰巧看到整理一下
當時用了最基本的演算法寫出來了, 兩個for迴圈, 乙個乙個取餘, 是質數就放進結果陣列中
**如下, 檢查**執行時間的**是來對比三種不同演算法的優劣性
演算法一: 每個數都從2開始除, 除遍所有比自己小的整數, 如果有能整除的, 說明不是質數, 退出本次迴圈, 進行下一次迴圈
functiontest()
}if($mark != 1)
}echo "";
print_r($array
);
echo "
";
echo
microtime(true)-$start
;}
面試官看了後讓我優化一下演算法, 當時我的**連break好像都沒有, 然後我就加了句break, 然後信心滿滿的看著他,
哈哈, 然後你可以想象下他的表情了~
不過, 他人還挺好, 告訴我並不需要每次都除到比自己小1的那個數, 我第一反應是除到一般就夠了,
然後他說, 除到這個數的平方根就可以了, 比如17除到4就行了, 因為當除數超過平方根後, 再除只是把商和除數的位置顛倒了而已, 是一種重複
演算法二: 除了把第二個for迴圈中的$i 換成 sqrt($i) 之外基本沒什麼變化
functiontest1()
}if($mark != 1)
}//echo "";
// print_r($array);
echo "
";
echo
microtime(true)-$start
;}
當然還有一種演算法, 質數是什麼? 非質數是什麼?
質數就是除了自己和1 之外不能被任何數整除, 非質數就是合數, 而合數則肯定可以由質數相乘得到.
通過這個規則, 我們就可以只檢查$i 是否可以整除比自己小的質數了, 非質數可以丟掉不管了.(此時的效率還不如演算法二高)
還可以再結合演算法二, 只檢查比$i平方根小的質數, (這時的效率就比演算法二高了)
演算法三: 這種演算法效率最高
functiontest2()
//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...