判斷質數與篩質數

2022-09-11 01:06:20 字數 1580 閱讀 3381

一:判定質數

要判斷乙個數是不是質數,只需遍歷小於等於它的所有數,如果它能被除了1和本身之外的數整除,那麼它就不是質數。

很簡單,暴力列舉,**如下:

1

bool is_prime(intx)2

但是還可以優化,對於乙個數$x$,它有乙個約數$d$,那麼$\frac$也是$x$的約數,所以我們只需要列舉較小的乙個就可以了,即$d <\frac$ ,即我們只需列舉到$\sqrt$即可。

1

bool is_prime(intx)2

時間複雜度就從原本的$o(n)$降為了$o(\sqrt)$。

二:分解質因數

由上面,我們知道$x$中最多隻包含乙個大於$\sqrt$的質因子,如果有兩個就大於$x$了,矛盾。所以我們先列舉小於等於$\sqrt$的質因子,再特判一下大於$\sqrt$的質因子即可。**如下:

1

void solve(int

n)10 cout << i << "

"<< s <12}

13if(n != 1)cout << n << "

"<< 1

<14 }

三:(1)篩法求質數

思想是,將$2\sim n$之間的數枚舉,從前往後,依次將每乙個數的倍數篩掉,用乙個$primes$陣列儲存質數,**如下:

1

void 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)線性篩法:

1

void 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...