篩選素數的三種方法 包含尤拉篩

2021-10-09 03:26:35 字數 933 閱讀 7026

具體方法的介紹可以看下面詳細**,有注釋

//選出素數方法

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