4. 注意點素數又稱質數,是指除了1和本身之外,不能被其他數整除的一類數,反之,則稱為合數。5. 題型訓練
6. 參考資料
注意:小於等於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()
一定要記得特判小於等於111不是質數!!!
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()
}}
資料結構:我們使用下面的「篩法」,達到時間複雜度為 o(n
int prime
用於儲存所有的素數;
bool p
用於快速判斷某乙個數是否為素數;
pnum
用於記錄素數的數量。
"篩"的實現,可以使用乙個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()
一定要記得特判小於等於111不是質數!!!
注意上面的條件非常重要!!!雖然篩法簡單,但是做題目的時候很容易出錯【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 大寫字母和小寫字母轉...