尋找素數的方法 二重迴圈暴力 埃氏篩法 尤拉篩法

2021-10-03 13:46:05 字數 2729 閱讀 1518

尋找素數方法有很多,下面介紹幾種常用的方法。很多小夥伴在剛開始程式設計時對於找素數的題目,第一反應是–這還不簡單(迴圈+判斷)我分分鐘ac掉你~~。但是**提交後發現,尼瑪?咋肥事捏!!!總有個別測試點因為執行超時而不能通過。

素數的定義:素數又稱為質數,是指除了1和本身之外,不能被其他數整除的一類數。

本文解決兩個問題:1、如何判斷給定的正整數n是否為質數;2、用最短時間得到1~n的素數表。

方法一:乙個整數n為素數,則它不能被2,3

,...

,n−1

2,3,...,n-1

2,3,..

.,n−

1中的任何乙個整除。如果這樣判斷的話時間複雜度為o(n

)o(n)

o(n)

。單純一道求解素數的題目,顯然沒有問題,但是=_=,你以為呢???不妨試試這道題[c++ 藍橋杯adv-184 演算法提高 素數求和]。

方法一的改進:

注意到如果在2~n-1中存在n的約數,不妨設為k,即n

n%k==0

n,那麼由k∗(

n/k)

==nk*(n/k)==n

k∗(n/k

)==n

可知,n/k

n/kn/

k也是n的乙個約數。且n

nn與n/k

n/kn/

k中一定滿足其中乙個小於等於n

\sqrt n

n​,另乙個大於等於n

\sqrt n

n​。所以,只需要判定n是否能被2,3

,...

,2,3,...,

2,3,..

.,⌊ n⌋

\left\lfloor\sqrt n\right\rfloor

⌊n​⌋

中的乙個整除,即可判定n是否為素數。該演算法的時間複雜度為o(n

)o(\sqrt n)

o(n​)。

放上**:

bool isprime(int n)

return true;

}

這種寫

法較為簡

單,但是

當i接近

int型

變數上界

時會導致

i∗i溢

出(當n

在109

以內都會

是安全的

),解決

辦法是將

i定義為

long

long

型,這樣

就不會溢

出了。這種寫法較為簡單,但是當i接近int型變數上界時會導致i*i溢位(當n在10^9以內都會是安全的),解決辦法是將i定義為long long型,這樣就不會溢位了。

這種寫法較為

簡單,但

是當i接

近int

型變數上

界時會導

致i∗i

溢位(當

n在10

9以內都

會是安全

的),解

決辦法是

將i定義

為lon

glon

g型,這

樣就不會

溢位了。

方法一:列舉

從1~n進行列舉,判斷每個數是否為素數,如果是,則加入素數表。這樣列舉的時間複雜度是o(n

)o(n)

o(n)

,而判斷素數的時間複雜度是o(n

)o(\sqrt n)

o(n​

),總的時間複雜度是o(n

n)o(n\sqrt n)

o(nn​)

,這個複雜度對n

nn不超過105

10^5

105的大小是沒有問題的。

可結合方法一解決,自己實現一下吧~~

int v[101]=;//陣列長度要與n大小匹配哦,這裡假設n=100;,該思想結合了雜湊雜湊 

void find_prime()

for(int j=1;j<=n;j++)^n \frac)=o(n\log \log n)

o(∑i=1

n​in

​)=o

(nloglogn)

,自己記住就好了吧^ _^

**如下:

int v[1001]=;//陣列長度要與n大小匹配哦 ,該思想結合了雜湊雜湊

void find_prime()

} }for(int k=1;k<=n;k++){//輸出素數表

if(v[k]==0) cout<方法三:尤拉篩法 時間複雜度o(n

)o(n)

o(n)

基本思想:在埃氏篩法的基礎上,讓每個合數只被它的最小質因子篩選一次,以達到不重複的目的。

先寫到這吧。。。

尤拉篩法講解 **鏈結來自嗶哩嗶哩

尤拉篩法(線性篩)的學習理解 csdn參考鏈結

本文所講的一道水題 c++ 藍橋杯adv-184 演算法提高 素數求和

素數篩法 埃氏篩及尤拉篩

在做題中會經常遇到有關素數的問題,整理一下學過的兩種素數篩法。時間複雜度 o nloglogn 我們知道乙個素數的倍數肯定是乙個合數,乙個合數可以由多個素數相乘得到,所以可以從2開始把2的倍數篩一遍,找到下個素數在篩一遍。篩完後素數的倍數都被篩掉了,剩下的就是素數。如下 const int n 1e...

素數之埃氏篩法 尤拉篩法

判斷數n是否為乙個素數,基本方法為從2開始向後列舉,若n不能被2,3,4,n 1整除,則n為素數,該判斷方法的時間複雜度為o n o n o n 更快的方法為,當列舉至n sqrt n n 時即可判斷是否為素數,該判斷方法的時間複雜度為o n o sqrt n o n 如下 寫法1,其中sqrt函式...

線性篩法求素數(埃氏篩法 尤拉篩法)

篩法都是初始化把所有數都先設為素數,然後篩除合數。理解起來比較簡單,就是從小到大的列舉每乙個數,標記它的所有倍數都是合數 非素數 放到u i 為false,u中的下標對應的就是這個數的值。bool u maxn int num,su maxn 1.埃氏篩法 void prime 從小到大的篩選素數,...