具體方法的介紹可以看下面詳細**,有注釋
//選出素數方法
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
1010
;//方法1:試除法
bool
s_prime
(int a)
return
true;}
//方法2:埃氏篩法,時間複雜度o(nloglog2(n)),缺點,比如10000會被重複篩除很多次(2,5,10...)
bool num[maxn]
;int
e_sieve
(int n)
//篩除0~n之間的非素數
//改進,//當i為素數時,能夠被i整除的數肯定不是素數,這裡j=2*i可以改進為j=i*i,因為當i=5時,2*5,3*5,4*5在前面i為2,3,4時已經算過了
}int k =0;
int prime[maxn]
;for
(int i =
2; i <= n;
++i)}}
//方法3:尤拉篩:時間複雜度o(n)
//對於每乙個數,要麼他是素數,要麼它是素數的倍數
//所以用最小的質因子來篩,又因為主迴圈從2~n,所以每個數都會被篩到,而且只會被篩一次
int prime[maxn]
, i, j, countnum =1;
bool num[maxn]
;int
oula
(int n)}}
intmain()
素數篩選的三種方法
第一種 剔除2 3 4 5 6 的倍數 在i從2開始的增一變化過程中,剔除i的倍數即j i j是大於等於2的自然數,j的上限是問題規模m 為了減少重複步驟,可以每當i遞增到等於第乙個沒有被剔除的 素 數時再剔除該數的倍數,重複上述過程至i到達問題規模m的平方根 1 需要說明的三個問題 假設迴圈到第n...
根號法 埃氏法 尤拉篩選。三種方法求素數
先上開根號求素數 乙個數n的最小質因子,必定小於開根號n 數學表達 a b n,若a 開根號n,b必定 開根號n,所以只要求2 開根號n,即可判斷n是不是素數。反證法如果數n的最小質因子a大於開根號n,那數n的另乙個因子b,b和a構成一對n的約數 必定大於a,那麼也大於根號n,這時候,a b必定大於...
三種素數篩選方法
第一種 剔除2 3 4 5 6 的倍數 在i從2開始的增一變化過程中,剔除i的倍數即j i j是大於等於2的自然數,j的上限是問題規模m 為了減少重複步驟,可以每當i遞增到等於第乙個沒有被剔除的 素 數時再剔除該數的倍數,重複上述過程至i到達問題規模m的平方根 1 需要說明的三個問題 假設迴圈到第n...