一:判定質數
要判斷乙個數是不是質數,只需遍歷小於等於它的所有數,如果它能被除了1和本身之外的數整除,那麼它就不是質數。
很簡單,暴力列舉,**如下:
1bool is_prime(intx)2
但是還可以優化,對於乙個數$x$,它有乙個約數$d$,那麼$\frac$也是$x$的約數,所以我們只需要列舉較小的乙個就可以了,即$d <\frac$ ,即我們只需列舉到$\sqrt$即可。
1bool is_prime(intx)2
時間複雜度就從原本的$o(n)$降為了$o(\sqrt)$。
二:分解質因數
由上面,我們知道$x$中最多隻包含乙個大於$\sqrt$的質因子,如果有兩個就大於$x$了,矛盾。所以我們先列舉小於等於$\sqrt$的質因子,再特判一下大於$\sqrt$的質因子即可。**如下:
1void solve(int
n)10 cout << i << "
"<< s <12}
13if(n != 1)cout << n << "
"<< 1
<14 }
三:(1)篩法求質數
思想是,將$2\sim n$之間的數枚舉,從前往後,依次將每乙個數的倍數篩掉,用乙個$primes$陣列儲存質數,**如下:
1void get_primes(intn)2
10 }
當$i = 2$,迴圈$\frac$次, 當$i = 3$ ,迴圈$\frac$次。所以一共迴圈$\frac+\frac+\frac+\cdot \cdot \cdot \frac=n\left ( \frac+\frac+\frac+\cdot \cdot \cdot +\frac \right )$,當$n$趨於無窮時,調和級數趨於$lnn + c$。
所以該演算法的時間複雜度為$o(nlogn)$。這個複雜度是計算將每乙個數的倍數篩掉的時間複雜度,而**中的只將素數的倍數篩掉的複雜度會更低一些,為$o(nloglogn)$。
($1 \sim n$ 中有$\frac$個素數)。
(2)線性篩法:
1void get_primes(intn)2
11}12 }
將每乙個質數加入,然後該質數去篩掉該質數的倍數。當$i \;mod\; primes[j] == 0$時,$primes[j]$一定是$i * primes[j]$的最小質因子,也一定是$i$的最小質因子。當$i \;mod\; primes[j] != 0$時,說明$primes[j]$小於$i$的所有質因子,所以$primes[j]$也一定是$primes[j] * i$的最小質因子。對於乙個合數$x$,假設$primes[j]$是他的最小質因子,當$i$列舉到$\frac$的時候,($\frac$一定比$x$先列舉到),$x$就會在迴圈內被篩掉。由於每乙個數只有乙個最小質因子,所以是線性的。
質數 篩質數
質數定理 1 n中質數有n ln n 個質數 按順序刪除每個數的倍數,最後剩下的就是質數。給定乙個正整數n,請你求出1 n中質數的個數。輸入格式 共一行,包含整數n。輸出格式 共一行,包含乙個整數,表示1 n中質數的個數。資料範圍 1 n 1061 n 106 輸入樣例 8輸出樣例 4 includ...
3 篩質數 質數
篩質數的核心思想 先把所有數放進乙個陣列 然後從前往後看,把每乙個數的倍數刪掉 第乙個數是2,就把所有2的倍數刪掉,4,6,8,10,12 第二個數是3,就把所有3的倍數刪掉,6,9,12 第二個數是4,就把所有4的倍數刪掉,8,12 第二個數是5,就把所有5的倍數刪掉,10 以此類推 這樣篩完之後...
質數中的質數(質數篩法)
如果乙個質數,在質數列表中的編號也是質數,那麼就稱之為質數中的質數。例如 3 5分別是排第2和第3的質數,所以他們是質數中的質數。現在給出乙個數n,求 n的最小的質數中的質數是多少 可以考慮用質數篩法來做 input 輸入乙個數n n 10 6 output 輸出 n的最小的質數中的質數。input...