為什麼只遍歷到sqrt(n)就夠了?
反證法:
假設只遍歷2~sqrt(n)不能把所有非素數置為false,即遍歷完了2~sqrt(n)後,在sqrt(n)~n範圍內仍有乙個非素數k,但isprime[k]=true。
證: k在sqrt(k)之前一定有乙個素數因子(任何非素數都可以拆成素數的乘積,所以k至少有乙個素數因子),sqrt(k)肯定小於sqrt(n),所以sqrt(n)之前一定有乙個k的素數因子y,那麼根據**中的演算法,i=y的時候,k肯定會被置為非素數,即此時isprime[k]就會被置為false,原假設不成立。
因此只需遍歷2~sqrt(n)即可。
此方法時間複雜度為o(n*loglogn),空間複雜度為o(n)
1 #include 2 #include 34using
namespace
std;56
#define maxn 10000
7int prime[maxn+10]; //
儲存篩得的素數
8int primesize; //
儲存素數的個數
9bool mark[maxn+10]; //
若mark[i]為true,表示i被標記為素數
1011
void
init()12
25} 26}
27
素數篩法(模板)
質數 在大於1的整數中,如果只包含1和本身這兩個約數,那麼就是素數時間複雜度 o sqrt n static boolean prime int n return true 合數只會被它的最小質因子篩掉 時間複雜度 o n static final int n static int prime ne...
模板 素數篩法
好 快 素數是什麼就不用介紹了吧。先介紹判斷素數的方法 先看樸素演算法 for i 2 i if n i 0 break if i n printf n is prime else printf n is not prime 真的好樸素。用時o n 肯定不行啊,吃棗藥丸的。怎麼優化呢?不難發現,如果...
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...