素數的篩法,n long n 和O n 的寫法

2021-07-13 01:40:55 字數 398 閱讀 1325

需求:產生區間[0, n]之間的素數。

最簡單的方法是,乙個乙個套,但是每試探乙個數n, 需要列舉sqrt(n)次,所以這種演算法的時間複雜度就是o(n*sqrt(n)), 也就是n*n。

那麼效率更加高一點的方法是,把每個素數的2,3,4,... x, (x <= sqrt(n)) 倍數篩選出來,留下的就是素數。 該演算法效率是 n*log(n)。

void sieveone()

} }}

其實還有更加高效的演算法。 根據因式分解定理,每乙個合數都可以分解為 n= p^k*q的形式,又因為每個合數的分解方式是唯一的,所以該演算法的效率是o(n)。

void sievetwo()

} }}

素數的篩法

素數的篩法有很多種 在此給出常見的三種方法 以下給出的所有 均已通過這裡的測試 名字好長 joy 不過 很短 思路非常簡單,對於每乙個素數,列舉它的倍數,它的倍數一定不是素數 這樣一定可以保證每個素數都會被篩出來 還有,我們第一層迴圈列舉到 sqrt n 就好,因為如果當前列舉的數大於n,那麼它能篩...

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

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

改進的篩素數法

最簡單的篩素數法方法就是從2開始,將所以2的倍數去掉,然後從3開始,將3的倍數去掉。根據這樣很容易寫出 下面 就是是篩素數法得到100以內的素數並儲存到primes陣列中。cpp view plain copy by morewindows const intmaxn 100 bool flag m...