比線性篩垃圾一點的素數篩法

2022-05-30 15:54:13 字數 496 閱讀 5577

1.n^2的,蠻爛的時間複雜度(本來就想不出正解了還這麼浪費時間

for(int i=2;i<=n;i++)

for(int j=2;j*i<=n;j++)

noprime[i*j]=1;

2.小小優化

for(int i=2;i<=n;i++)

if(!noprime[i])

for(int j=2;j*i<=n;j++)

noprime[i*j]=1;

對於乙個合數,它一定是可以由合數乘上來的。例如

4=2*2

如上例,noprime[4]=1是由2算出的,那麼noprime[4j]一定也被2j算過了,直接跳過就行。

因為資料範圍越大,質數率越小(我在顱內證明了一下,應該是對的吧 吧),所以挺穩定的。

最後吐槽一下洛谷某些紅名大牛的題解,寫了個我上面的第二種還自稱線性篩

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

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

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

目錄所謂篩法是一種思想,就像名字一樣,篩去多餘的,篩去錯誤的。多數情況用陣列標記,複雜度看起來很大,但 跑起來確是越跑越快。把n以內素數全找出來 n 100000 大家一定想得到第一種方法,暴力,遍歷。暴力 include includeint isprime int n return 1 int ...

素數篩法(埃氏篩,線性篩)

時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...