素數篩選法講解(普通篩和線性篩)

2021-09-04 11:23:22 字數 819 閱讀 8793

當乙個數不算大的時候,可以用普通的求素數的方法去求,但是如果乙個數過大的話,就像讓求1~1000000000之間素數的個數,普通方法就不行了,這時候就需要用到素數篩選法,它的時間複雜度是o(n),儘管不算很好,但是,也算是目前為止比較快的一種方法了,它是以空間換取時間,現在的計算機,空間有的是,但是時間是非常珍貴的。

效率問題特別重要。他的原理就是標記,防止重複判斷,這樣提高了效率。就像2是素數,所有是2的倍數的肯定都不是素數,這時候標記上,接著判斷3是素數,所有是3的倍數的都肯定不是素數,這時就要標記上,以此下去,執行到根下(總數),這樣就會得到乙個素數表,所有沒有被標記的都是素數,下面是具體的**實現,**裡面有注釋。寫的很清楚。

先來看看普通的求素數方法:

bool prime[max];

void getprime()}}

}

它的執行時間是非常長的,所以這時候就要引出素篩的演算法:

bool prime[max];

void getprime()

}}

素篩的**比較短,而且執行速度很快,是用了空間換了時間,不過現在來說,時間更加重要一些,所以素篩還是被廣泛運用的。

其實如果要再說去優化,優化的空間也已經很小了,即使是多次呼叫函式去判斷操作,優化也只能優化幾十ms,所以說只要用了素篩,一般就跟卡時間沒什麼關係了...

over!

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

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

篩法求素數(快速篩和普通篩)

先插乙個鏈結,這是我覺著關於這一方面,寫的比較好的部落格尤其是這個博主關於普通篩法的優化。插乙個知識點 任何合數,都能寫成素數的積的形式。比如 6 2 3 50 2 5 5。根據上面那個部落格,我寫兩點自己想出來的東西 普通篩法 關於為什麼 當前剩下的最小的數就是質數 素數 因為,假如a是合數,那麼...

素數篩選法(線性篩法模板)

include using namespace std const int n 1e7 bool flag n 10 int prime n 10 int main return0 include using namespace std typedef long long ll int prime ...