1、質數的定義為如下兩條:
2、實現
(1)設給定的乙個數為 x
,從2開始遍歷到 x-1
,判斷該數能否整除這些數。
1defis_prime(x):
2if x == 1:
3return
false
4for i in range(2, x):
5if x % i ==0:
6return
false
7return true
(2)其實無需從2到x-1遍歷,而是只需要從2遍歷到√x即可。其原因是,假設x是合數,那麼他可以寫成兩個整數的積,即:x
= a × b
,則必定有 a
≤ √x
且 b≤ √x,
因此可以將複雜度進一步降低。
1def isprime(self, n: int) ->bool:
2if n == 1:
3return
false
4 tmp = n ** 0.5
5for i in range(2, int(tmp) + 1):
6if n % i ==0:
7return
false
8return true
(3)其實質數還有乙個特點,就是它總是等於 6n+1 或者 6n+5,其中 n 是大於等於1的自然數。這條也是很好被證明的,假設 y = x % 6,y 無非就是以下幾種情況:0, 1, 2, 3, 4, 5
y01
2345
備註被6整除
被2整除
被3整除
被2整除
合數/質數
合數合數
合數合數
因此我們有如下推論:
對於第二條推論也很好證明:
(2)中我們遍歷了 [2,√x ] 中的所有數,依次判斷了 x 能否除盡這些數。但是是否真的有必要逐個判斷呢?我們把 [2,√x ] 中的所有數按模6的餘數分為以下6類:6n, 6n+1,6n+2,6n+3,6n+4,6n+5。
假設 x 能除盡 6n, 6n+2,6n+4,那麼 x 必然是乙個偶數,但是根據第一條推論,如果 x 是質數則 x = 6n+1 或者 6n+5,顯然 x 也必然是奇數,這與 x 是偶數矛盾,所以假設 x 是質數,則 6n, 6n+2,6n+4 不必判斷也知道是除不盡的。
6n+3也同理。換言之我們只需要檢查 [2,√x ] 中 6n+1,n ≥ 1 或者 6n+5,n ≥ 0 是否是 x 的約數即可。如果都不能整除則 x 是質數,否則為合數。
1defis_prime(x):
2if x == 1:
3return
false45
if x % 6 != 1 or x % 6 != 5:
6return
false
78 root = int(x ** 0.5)
9for i in range(5, root+1, 6):
10if x % i == 0 or x % (i+2) ==0:
11return
false
1213
return true
JS判斷乙個數是否為質數
非正則實現function isprime num 因為2是比較特殊的質數,所以先拿出來 if num 2 else if num 2 0 依次判斷是否能被奇數整除,最大迴圈為數值的開方 let squareroot math.sqrt num 因為2已經驗證過,所以從3開始 且已經排除偶數,所以每...
判斷乙個數是否為質數(素數)
從鍵盤上輸入乙個數,判斷這個是數是否為質數 素數 質數 素數 除了1和它本身不能被其它數整數的數。如果 i,n 都是整數,那麼 i n 0,那麼就稱 i 是 n 的倍數,n 是 i 的約數或者因數,n 整除 i,i 被 n 整除。演算法 判斷乙個數是否質數 素數 只需判斷有沒有乙個數可以整除這個數就...
java判斷乙個數是否為素數 質數
質數 prime number 又稱素數,定義為乙個大於1的自然數,除了1和它本身外,不能被其他自然數整除,換句話說就是該數除了1和它本身以外不再有其他的因數。第乙個思路 假如我們需要判斷數字是33,因為所有的數都可以被1整除,所以我們從2開始,一直到33 1 32進行遍歷,看看這個數可以被哪些數整...