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