1.引例
博主第一次見到這個演算法是在兩個周以前,因為團隊要求提前回來培訓資料結構,所以過完元宵節沒幾天,便匆忙往學校趕,無奈囊中羞澀,只能訂半夜的機票,下了飛機取完行李後,便坐在旁邊的椅子上,像成功人士一般拿出電腦學習,等待著第一班地鐵,無意中看到這個演算法,便開始研究起來。
2.定義
埃拉託斯特尼篩法,簡稱埃氏篩或愛氏篩,是一種由希臘數學家埃拉託斯特尼所提出的一種簡單檢定素數的演算法。
要得到自然數n以內的全部素數,必須把不大於根號n的所有素數的倍數剔除,剩下的就是素數。
3.分析
要得到自然數n以內的全部素數,必須把不大於sqrt(n)的所有素數的倍數剔除,剩下的就是素數。
給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去…。
思想:假設全部數均為素數,再通過剔除掉所有合數,剩下的數肯定為素數;
數學原理:任何正整數(除1外),所有正整數均能分解為素數的乘積。
用途:快速找1~k中所有素數;
優化:對於乙個合數k,必能在 [2,sqrt(k)]區間找到乙個素數因子; 1~k中,合數k最大,選取的因子區間[2,sqrt(k)]包含了其他數a的因子區間[2,sqrt(a)].
tip:我們不是去找某個數的素數因子,而是通過素數因子來判斷一堆數是不是合數
#include
#include
bool is_prime[
1000];
intmain()
for(
int i =
2; i <=
sqrt
(n); i++)}
}for
(int i =
2; i <= n; i++)}
return0;
}
埃氏篩選法
思想 假設全部數均為素數,再通過剔除掉所有合數,剩下的數肯定為素數 數學原理 任何正整數 除1外 所有正整數均能分解為素數的乘積。用途 快速找1 k中所有素數 優化 對於乙個合數k,必能在 2,sqrt k 區間找到乙個素數因子 1 k中,合數k最大,選取的因子區間 2,sqrt k 包含了其他數a...
埃氏篩法 素數的快速篩選
埃氏篩法的的核心是 素數的倍數都不是素數。那我們執行這樣乙個策略,我們可以確定的是 2 是最小的素數,建立乙個表並將除了 0 1 外的所有數標記為素數,我們將篩選範圍內的 2 的倍數全部標記為合數 非素數 然後取出表中最小的素數,執行相同的策略 講素數的倍數標記為非素數 下圖可以完美的演示這樣乙個演...
素數的快速篩選(埃氏篩法)
要列舉n以內的素數,可以用埃氏篩法。這是乙個與輾轉相除法一樣古老的演算法。首先,將2到n範圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都劃去。表中剩餘的最小數字是3,它不能被更小的數整除,所以是素數。再將表中所有3的倍數全都劃去。依次類推,如果表中剩餘的最小數字是m時,m就是素數...