知識點4 素數 質數

2021-10-03 14:27:58 字數 3139 閱讀 9115

4. 注意點

5. 題型訓練

6. 參考資料

素數又稱質數,是指除了1和本身之外,不能被其他數整除的一類數,反之,則稱為合數

注意:小於等於1的數既不是素數,也不是合數。

本節將解決兩個問題:

如何判斷給定的正整數n是否是質數;如何在較短的時間內得到1~n內的素數表。

解法一:暴力。由素數的定義可以遍歷從2 ~ n-1的數,判斷它們是否可以整除n。但是這樣時間複雜度就到達了 o(n

)o(n)

o(n)

,通常判斷素數只會作為程式的一部分,所以這樣的時間複雜度還是有點高。

解法二:開根號。如果在2 ~ n-1中存在n的約數,不妨設為k,即n % k == 0,那麼由 k * (n / k)== n可知,n/k也是n的乙個約數,且k與n/k中一定滿足其中乙個小於等於n

\sqrt n

n​,乙個大於等於n

\sqrt n

n​。這樣我們只要判斷2 ~ n

\sqrt n

n​之間的整數就好了,時間複雜度為 o(n

)o(\sqrt n)

o(n​)。

**如下:

bool

isprime

(int n)

int sqr =

(int

)sqrt

(1.0

* n)

;//根號n,這個1.0要乘,(int)也要加

for(

int i=

2;i <= sqr;

++i)

}return

true

;//否則,就是true

}

注意:

上述**中,sqrt()的作用為乙個浮點數開根號,需要新增math.h標頭檔案。由於sqrt的引數要求是浮點數,因此在n前面乘以1.0來使其變成浮點數。

isprime()一定要記得特判小於等於1

11不是質數!!!

通過上面的學習,我們知道了怎麼判斷乙個數n是否是素數,那麼我們如果要統計1 ~ n之間的素數也就清楚了,演算法的時間複雜度為o(n

n)o(n\sqrt n)

o(nn​)

,當我們的資料n小於105

10^5

105時,這種演算法是不會超時的。**如下:

const

int maxn =

101;

//步長

int prime[maxn]

,pnum =0;

//prime陣列存放所有的素數,pnum用於儲存素數數量

bool p[maxn]=;

//p[i] == true表示i是素數

void

find_prime()

}}

資料結構

int prime用於儲存所有的素數;

bool p用於快速判斷某乙個數是否為素數;

pnum用於記錄素數的數量。

我們使用下面的「篩法」,達到時間複雜度為 o(n

"篩"的實現,可以使用乙個bool型陣列p來標記,如果a被篩掉,那麼設定p[a]true;否則,p[a]false。程式初始化時,記得初始化p陣列全為false

**如下:

const

int maxn =

101;

int prime[maxn]

,pnum =0;

bool p[maxn]=;

void

find_prime()}}}

注意:

上述**中,sqrt()的作用為乙個浮點數開根號,需要新增math.h標頭檔案。由於sqrt的引數要求是浮點數,因此在n前面乘以1.0來使其變成浮點數。

isprime()一定要記得特判小於等於1

11不是質數!!!

注意上面的條件非常重要!!!雖然篩法簡單,但是做題目的時候很容易出錯【pat b1007】素數對猜想

【pat b1013】數素數

【pat a1015】reversible primes

【pat a1078】hashing

素數判定——哈工大

素數——北航

leetcode 204. count primes

pat a1116 come on! let』s c

⭐pat a1152 google recruitment

演算法筆記

質數相關知識點詳解

上課!定義 若乙個正整數無法被除了1和它自身之外的任何數整除,則稱該數為質數 或素數 否則稱該數為合數。我們需要明確,整個自然數集合中,質數的分布比較稀疏,對於乙個足夠大的整數 n 不超過它的質數大約有 frac 個,換句話說,就是每 ln n 個數中大約有1個質數。我們需要明確,計算機最優秀的地方...

知識點彙總4

1.gcc,是乙個程式語言編譯器,用來構建不同語言編寫成的軟體 2.軟體需求工具 需求建模和需求追蹤工具。3.軟體構造工具 即開發工具 編輯器,直譯器,偵錯程式,生成器。4.業務邏輯層 ejb。5.訊息服務 jms。6.提 用程式的通訊介面 rmi iiop 7.同一類new的兩個物件,狀態可能不同...

C語言知識點4

第八節 字元 1 字元資料的合法形式 1 是字元佔乙個位元組,1 是字串佔兩個位元組 含有乙個結束符號 0 的ascii數值表示為48,a 的ascii數值是97,a 的ascii數值是65。一般考試表示單個字元錯誤的形式 65 1 字元是可以進行算術運算的,記住 0 0 48 大寫字母和小寫字母轉...