素數,各種素數,各種題總是遇到素數。
下面我們來說一下求素數的一種比較有效的演算法。
就是篩法。因為這個要求得1-n區間的素數只需要o(nloglogn)的時間複雜度。
下面來說一下它的思路。
思路:現在又1-n的數字,素數嘛就是除了1和本身之外沒有其他的約數,所以有約數的都不是素數。
我們從2開始往後遍歷,是2的倍數的都不是素數,所以我們把他們劃掉
然後現在從2往後就是3了 因為3的前面沒有能整除3的,所以3是素數,然後3的倍數全都不是素數,我們接著劃掉。
然後就是5了,因為4是2的倍數不是素數(這裡可能會問,那4的倍數呢,因為4的倍數必然是2的倍數,所以早就劃掉了),所以我們接著來看5,劃掉5的倍數
就這樣我們一次類推,求到根號下n(sqrt(n))就行了 ,因為為什麼到sqrt(n)就行了呢,舉個例子吧假設sqrt(n)=7; 現在到7了 7的兩倍10 已經被前面的2消去了,7的3倍21已經被3消去了。。。。所以到7的時候只有7的7倍還存在。
下面貼上**:
#includeusing namespace std;
int main()
} }for(int i=1;i<10000;i++)
{ if(b[i])
cout<
好了!
感謝自己堅持。
素數 埃氏篩法
題目 求2 100以內的素數。素數 prime number 又稱質數,是指乙個大於1的自然數,除了1和它本身外,不能被整除以其他自然數。解法一 根據素數的定義,即用該數除比其小的數 1除外 都不能除盡,即為素數 public class prime if i n system.out.print ...
埃氏篩法 素數篩
埃式篩法 給定乙個正整數n n 10 6 問n以內有多少個素數?做法 做法其實很簡單,首先將2到n範圍內的整數寫下來,其中2是最小的素數。將表中所有的2的倍數劃去,表中剩下的最小的數字就是3,他不能被更小的數整除,所以3是素數。再將表中所有的3的倍數劃去 以此類推,如果表中剩餘的最小的數是m,那麼m...
素數篩法(埃氏篩,線性篩)
時間複雜度o nloglogn void prime int b prime i 1則是合數 原理很簡單,所有合數可以表示為乙個質數跟另乙個數的積,列舉每個已知素數的倍數就能標記完。但很明顯,這樣做會有重複。比如12 3 4 2 6,在2這個素數進行倍數標記時會標記,在3這個素數進行倍數標記時同樣會...