埃氏篩法的原理是:
給出要篩數值的範圍n,找出以內的素數。
先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去…。
任何乙個大於1的自然數 n,如果n不是素數,都可以唯一分解成有限個素數的乘積。
例如:8 = 2 * 2 * 2 ; 6 = 3 * 2 ……
**實現一:
bool is_prime[
100]
;// 這裡這個陣列全部初始化為0了
void
init()
}void
judge_prime()
}}}
**實現二:
bool vis[maxn]
;void
init()
void
is_prime()
}
memset是個啥
memset:作用是在一段記憶體塊中填充某個給定的值,它對較大的結構體或陣列進行清零操作的一種最快方法。
如果要把乙個char a[
20]清零, 一定是 memset
(a,0,20
)
線性篩法的原理是:
首先,我們要知道,埃氏篩法無法避免重複篩選(比如30 = 2 * 15 , 那麼30這個數,在2的時候會處理一次,在15的時候又會處理一次)。所以為了避免重複篩選,有了線性篩法。
線性篩是在埃氏篩法的基礎上,讓每乙個合數(除了素數以外的數),只被它的最小質因子篩選一次,達到不重複的目的。
每次只要篩選小於等於i的第乙個素因子的素數與i的乘積
bool vis[maxn]
;int prime[maxn]
,cnt;
void
init()
void
is_prime()
}}
線性篩法求素數(埃氏篩法 尤拉篩法)
篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...
素數篩法 埃氏篩及尤拉篩
在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...
埃氏篩 線性 尤拉 篩
埃氏篩 簡單,暴力。int isprime 50000 void getlist int size 看似簡單,但不真搞明白這個,無法學會線性 尤拉 篩。關鍵在於如何去做的合數,用了兩個引數,乙個是質數,即 prime i 另乙個是質數的倍數,即 j 相乘得到合數。線性篩 埃氏篩的改良版,使乙個合數只...