數學 質數篩 素數篩法

2021-09-28 16:17:47 字數 2110 閱讀 5057

date:2019/10/16??

其實現在都快1點了,算是16號,啊??

今天講了素數的篩法

其實,在很小的資料範圍內,不同的演算法複雜度是差不多的,但是,如果處理幾個資料,演算法的作用就沒有發揮出來

樸素演算法

埃氏篩法

線性篩法(尤拉篩)

p3383 【模板】線性篩素數

素數最樸素的演算法了

它的時間複雜度是o(n*sqrt(n))

bool prime (

int x)

}return1;

}

但是,這只適用於小資料的處理,所以我們需要改進演算法

時間複雜度是

o(nloglogn)

具體**是

for

(int i =

1; i <=

sqrt

(n); i ++

)}

但是這個演算法在1e7左右還是不太好用,會tle(~~哭暈~

而且埃氏篩法還有乙個缺陷 :

對於乙個合數,有可能被篩多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……

那麼如何確保每個合數只被篩選一次呢?我們只要用它的最小質因子來篩選即可,這便是尤拉篩法

線性篩法是什麼意思呢?

就是我們在埃氏篩法中有個問題就是乙個數可能被篩多次

所以就造成了時間的浪費,所以演算法就在這裡做了改進

基本思想:在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的

漲知識ing~~~

%%%%%%dalao 們

做個水題

p3383 【模板】線性篩素數

裸題

//author:philfan;

;//如果質數沒有多,b[i]就和上乙個一樣

for(

int j =

0;j < tot && i * p[j]

<= n+

5; j++)}

}int

main()

else

}return0;

}

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

找素數(質數) 線性篩法和埃氏篩法

先看這道題 洛谷p1217回文質數 對於這道題,普通的暴力模擬會tle,所以得尋求改進。這裡我學會了兩種方法 第一種 線性篩法 這種演算法的核心思想就是 任何乙個合數都可以由質數相乘得到 下面就是核心 吃透了核心 就可以在其中新增點細節,然後就可以拿去解決問題了 這裡需要開多大的陣列取決自己 boo...

Eratosthenes篩法(素數篩)

最一般的素數篩思想很簡單,對於不超過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不是素數哦 這樣已經不慢,但由於所有非素...