求素數的幾種方法(暴搜法和篩選素數法)

2021-09-13 11:17:16 字數 1410 閱讀 5110

參考自該篇部落格

參考自該篇部落格

其分為兩種,一種是直接for迴圈,另一種是建立在數學思想上的平方根迴圈。第二種演算法時間複雜度明顯優於第一種。

也就是最簡單直接的for迴圈,判定這個數是否能被除1 和其本身以外的整數整除。

這個也是基於for迴圈的一種方式,比上面那種方法稍微快了一點。當n的數值較大時,程式執行時間也比較長。原理:乙個數只能被1和其本身整除,這樣的數稱為素數反之,不滿足這個條件的即為非素數。

假定非素數num,一定能分解為兩個整數的乘積,n和m,num = n * m;若n,m都大於sqrt(num),則不成立;所以,n和m中一定有乙個小於等於sqrt(num)。換句話說,如果不存在這樣的乙個小於sqrt(num)的整數,則num就為素數。

**:

#include#includeusing namespace std;

int main()

要求n以內的素數,我們可以先構建乙個大小為n+1的bool型別陣列,並將各元素初始化為true(true表示為素數,false表示非素數),再通過演算法將素數的下標所對應元素值賦為true,最後輸出所有為true元素的下標即可。

用乙個長度為n+1的陣列儲存資訊(true表示素數,false表示非素數),先假設所有的數都是素數(初始化為true),從第乙個素數2開始,把2的倍數都標記為非素數(置為false),一直到大於n;然後進行下一趟,找到2後面的下乙個素數3,進行同樣的處理,直到最後,陣列中依然為true的數即為素數,遍歷輸出即可。

#include#include#includeusing namespace std;

# define n 1024

int main()

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

return 0;

}

是普通篩選法演算法的改進。
#include#include#includeusing namespace std;

# define n 1024

int main()

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

return 0;

}

在普通篩選法的基礎之上進行最大程度的優化。普通篩選法在提高執行效率的同時也有缺點,就是很多數被處理了不止1遍,因此又造成了比較大的不必要處理。比如說非素數6,以2進行篩選時篩選了一次,以3進行篩選,又篩選了一次,線性篩選素數就是乙個非素數以最小質因數篩選一次即可。
#include#include#includeusing namespace std;

# define n 1024

int main()

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

return 0;

}

求素數的幾種方法

素數,也稱為質數,其只能被1或者自身整除的自然數 不包括1 換而言之,只有兩個正因數的自然數稱為素數。與之相對的比1大但不是素數的自然數稱為合數。1和0既不是素數也不是合數,合數由若干個質數相乘得到。顯然根據定義就能判斷乙個數n是否為素數,具體的,對其從2到sqrt n 進行除法,判斷是否存在餘數為...

Java求素數(質數)的幾種方法

比1大的整數中,除了1和它本身以外,不再有別的因數,這種整數叫做質數或素數 要判斷x是否為質數,就從2一直嘗試到x 1的做法效率是最差的!其實只要從2一直嘗試到 x,就可以了。因為因數都是成對出現的。比如,100的因數有 1和100,2和50,4和25,5和20,10和10。看出來沒有?成對的因數,...

根號法 埃氏法 尤拉篩選。三種方法求素數

先上開根號求素數 乙個數n的最小質因子,必定小於開根號n 數學表達 a b n,若a 開根號n,b必定 開根號n,所以只要求2 開根號n,即可判斷n是不是素數。反證法如果數n的最小質因子a大於開根號n,那數n的另乙個因子b,b和a構成一對n的約數 必定大於a,那麼也大於根號n,這時候,a b必定大於...