尤拉篩是o(n)複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。
埃篩的基本思想是:素數的倍數一定是合數。
尤拉篩基本思想是:任何數與素數的乘積一定是合數
演算法概述:
遍歷[2, n]
的所有數i
,內層迴圈遍歷已經找到的素數prime[j]
,將i * prime[j]
標記為合數。
內層迴圈的最後,檢查如果prime[j]
是i
的最小質因子,則退出到外層迴圈,因為prime[j+1] * i
肯定已經被篩過了。
**:
#include
using
namespace std;
const
int maxn =
1e7+5;
int isprime[maxn]
;// isprime[i] 表示i是否素數
int prime[maxn]
;// 按順序存素數
int cnt =0;
// 素數個數
// 找出n以內的全部(cnt個)素數
void
euler
(int n)}}
intmain()
素數線性篩法(尤拉篩)
之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...
素數線性篩 尤拉Euler篩
prime陣列中的素數是遞增的,當i能整除prime j 那麼i prime j 1 這個合數肯定被prime j 乘以某個數篩掉。因為i中含有prime j prime j 比prime j 1 小,即i k prime j 那麼i prime j 1 k prime j prime j 1 k ...
尤拉篩法(線性篩素數)
以下內容 include include using namespace std intmain printf d n cnt return0 其中注釋為 關鍵!的句子的解釋大概如下 首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候...