最一般的素數篩思想很簡單,對於不超過maxx的每個非負整數p,刪除2p,3p,4p,……,然後剩下的就是素數,複雜度o(nlogn),因為對內層迴圈n/2+n/3+......+n/n 小於 1+1/2+1/3+...+1/n=ln(n+1)+γ,其中γ為尤拉常數≈0.577218
應當注意,1不是素數哦~
這樣已經不慢,但由於所有非素數都能由素數與素數的乘積表示,又可以優化如下
int maxx=1000000;
long long prime[maxx];
bool isprime[maxx];
void eratosthenes()
}}
時間複雜度是o(nloglogn)
但是還能再優化,內層迴圈不必從i*2開始,它已經在i=2時候就被篩掉了。優化如下:
int maxx=1000000;
long long prime[maxx];
bool isprime[maxx];
void eratosthenes()
}}
Eratosthenes篩法求素數
篩法的思想 對於不超過n的每個非負整數p,刪除2p,3p,4p,5p,當處理完所有數之後,還沒有被刪除的數就是素數 這是簡易版的篩法,也最好理解 for int i 2 i n i for int j i 2 j n j i vis j false 還可以繼續改進,為什麼呢?給定外層迴圈變數i,內層...
Eratosthenes篩法的F 實現
什麼是eratosthenes篩法 考慮乙個常見的數論問題,指定乙個整數,求出不大於該數的所有質數。我們可以先寫乙個函式來判斷某個整數是否為質數,然後用它逐一判斷每個整數,而eratosthenes篩法比這種方法高效得多。下面舉例來說明它的原理。觀察下面的彩圖 來自wikipedia 這裡是檢查12...
最大素因子 篩法
描述 greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題 給定乙個整數n,要求我們求出n的最大素因子的序數,例如 2的序數是1,3的序數是2,5的序數是3,以此類推.研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完題目的童鞋,我們規定 1的最大素因子序數是0.輸入有多組測試資料,...