演算法 求質數常見的三種方法

2021-09-05 10:17:35 字數 1177 閱讀 4454

最近新開了乙個欄目,打算記一些常見問題的演算法,以後說不定有用到可以套用一些。

質數(prime number)又稱素數,有無限個。質數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。

這次我們的例題是:

求n以內的質數。(其中 n是傳入的引數)。

這裡我們介紹三種常見方法:

1.完全遍曆法:

這種演算法比較基本,對於每個數n,將n依次從2除到n,然後對餘數進行比較,如果餘數是0,則除得盡,如果不是0則除不盡,按照質數的定義,只有1和他本身能成為因數也就是除得盡,所以只有除得盡的數不大於兩個時,才能是質數。

演算法實現:

int n;

int count=0;

cin>>n;

for(int i =2;i<=n;i++)

if(count ==1)

cout《篩選法

篩選法的核心是犧牲記憶體換速度,因為其不通過遍歷來表達一列數而是直接通過陣列來表達。用靜態的bool量去變現數的狀態。

其核心流程為:

定義乙個bool陣列,其下標為我們要判斷的數,其值為true。表示初始階段所有數都假定是素數。

開始對這個陣列進行篩選(及把值改為false),實現把因數含有2的所有數篩掉,把因數含有3的數篩掉,把因數含有5的數篩掉…一直篩選到只剩下素數為止。

這種方法的效率非常高,對於大小超過10萬的資料非常好用,但是對於資料量為千萬級的數來說,普通定義的陣列是不夠好用的,在實際除錯中我們可以發現,當資料大於800萬時,定義普通陣列會報錯。這時我們可以利用stl標準庫中來定義陣列。

#include using namespace std;

vectorsieve(int n); //函式宣告,求n以內的質數

int main(int argc, char const *argv)

cout << endl;

return 0;

}#includevectorsieve(int n)

for(int i = 2;i<=n;i++)

return shuju;

}

這種方法運算效率非常高,特別是在十萬級以上的數中,其犧牲掉的記憶體不多,但對速度的提公升確實是非常顯著的。

質數打表 (三種方法)

分析 所有可能的因數全部試一遍 const int maxn 1e6 5 int prime maxn voidp1 分析 先把所有整數列出來,然後把2的倍數全部剔除,然後是3的倍數,4的倍數 以此類推,遍歷所有素數,把倍數全部去掉。對於每個數字i,如果沒被去掉,它一定是質數,因為它不是任何2到i ...

求素數的三種方法

具體篩法是 先把n個自然數按次序排列起來。1不是質數,也不是合數,要划去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第乙個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第乙個沒劃去的數是5,把5留下,再把5後面所有能被5整除的數都劃去。這樣一直做下去,就...

求Fibonacci數列的三種方法

fibonacci數列 0,1,1,2,3,5,8,13。第一招 遞推法 includeint f 47 int main 第二招 不斷變換初始 include int main if n 1 n 2 puts 1 else if n 0 puts 0 else printf d n f3 retu...