演算法筆記(九) 之素數的一般解法和篩選解法

2021-10-24 06:16:34 字數 1026 閱讀 5017

老規矩–妹妹鎮樓:

了解了如何判斷素數,只要從2開始一直迴圈到n-1,如果有乙個數能整除n-1,則n不是素數。該演算法的複雜度為o(n)。

//全遍歷

bool

isprime

(int n)

return

true

;}

如果n不是素數,則在2~n-1中存在n的約數,設該約數為k,則n % k ==0,。那麼 可以得到k * (n / k) = n,則 n / k也是n的乙個約數。因此k 和 n / k這兩個n的約數定滿足乙個小於 sqrt(n),乙個大於sqrt(n)。因此,我們只需要判斷n能否被 2, 3, …, sqrt(n)中的乙個數整除即可。該演算法複雜度為o(sqrt(n))。

//遍歷一部分

bool

isprime

(int n)

return

true

;}

從2到n-1,列舉所有的數,對每個素數,篩掉它的所有倍數,那麼留下來的就都是素數了。這句話聽起來有點歧義,一開始並不知道素數是誰,怎麼篩?

就從2開始,2是素數,篩掉所有2的倍數;然後是3,3沒有被前面篩掉,則3也是素數,篩掉所有3的倍數…

原理是:當用這種方式篩到數a時,如果a沒有被前面步驟篩掉,則說明a沒有小於a的素因子,則a定為素數。

//篩選法

const

int maxn =

101;

//表長

int prime[maxn]

, pnum =0;

//素數表,表長

bool p[maxn]=;

//如果i為素數,則p[i]為false,初始化為false

void

find_prime()}}}

組合問題的一般C 解法

很多問題都可以歸結為組合問題 即c n,m 從n個元素中取m個,儲存所有組合情況。組合問題與排列問題不應該混為一談,排列需要考慮所取元素的放置順序,而組合問題則不考慮。stl中提供的next permutation解決的是排列問題,而且是全排列問題,即n個元素取出所有元素進行排列。本篇記錄一般性組合...

N皇后問題的一般解法 回溯法

先上 include include include include using namespace std vectorboard void showqueen void cout endl bool isvalid int rows,int cols,int order return true ...

一般Fibonacci演算法的優化

一般的fibonacci演算法 int fibonacci int number 該演算法的時間複雜度達到了驚人的指數級別,效率慢的不行,下面提供兩種不同的改進方式,時間複雜度分別為o n 和o logn 方法一 o n int fibonacci int number int result 0 f...