素數判斷 埃氏篩法和尤拉篩法(線性篩法)

2021-10-17 08:52:44 字數 1054 閱讀 9700

埃氏篩法的原理是:

給出要篩數值的範圍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 相乘得到合數。線性篩 埃氏篩的改良版,使乙個合數只...