(最高效能)高效求乙個數是否為素數,6倍原理

2021-08-10 20:24:01 字數 829 閱讀 4729

6倍原理就是:

素數只可能出現在6的倍數附近。

原因:6的倍數以外的數是什麼?6的倍數就是6k,6k附近的數,6k-3,6k-2,6k-1,6k,6k+1,6k+2,6k+3,那麼不在6k左右的幾個數是

6k-3,6k-2,6k+2,6k+3,第乙個和最後乙個數是可以整除3,另兩個數是可以整除2的,所以他們肯定不是素數。

所以只有6的倍數附近的兩個數才有可能是質數。

為什麼說可能是質數的,我舉個反例,25,35,49。。。

那具體是什麼時候才有可能是非質數呢?觀察一下 25((6-1)*(6-1)),35((6-1)*(6+1)),49((6+1)*(6+1)),...

為什麼呢?計算一下,(6k±1)(6p±1)=36kp±6p±6k±1,**右邊式子的36kp

±6p±6k是6的倍數,所以他們的乘積一定是6的倍數附近的數。

上**

//

高效判斷素數

private boolean isprime(int num)

//如果不在

6的倍數附近,肯定不是素數

if (num % 6 != 1 && num % 6 != 5)

//對6

倍數附近的數進行判斷

for (int i = 5

; i <= math.sqrt(num); i += 6)

}return true;

}

完美!就是要這樣追求極限效能!

正常我們是怎麼判斷的?

private boolean 

isprime(int num)

效率相差近乎一倍!

判斷乙個數是否為素數

判斷乙個數n是否是素數,只需要判斷它是否能被2到n之間的數整除就行了,若不能被整除,則說明是素數。考慮到某數大於n 2時,n不可能被該數整除,故只需遍歷2 n 2即可。更進一步,由合數定理可知,若乙個數是合數,則它的最小質因數必小於等於該數的平方根,由此可得更為高效的 如下 include incl...

判斷乙個數是否為質數(素數)

從鍵盤上輸入乙個數,判斷這個是數是否為質數 素數 質數 素數 除了1和它本身不能被其它數整數的數。如果 i,n 都是整數,那麼 i n 0,那麼就稱 i 是 n 的倍數,n 是 i 的約數或者因數,n 整除 i,i 被 n 整除。演算法 判斷乙個數是否質數 素數 只需判斷有沒有乙個數可以整除這個數就...

優化判斷乙個數是否為素數

1.問題描述 description 對任意給定的乙個正整數,判斷其是否為素數,並輸出判斷結果 input 輸入一行包含乙個正整數n,代表要判斷的數。output 如果n是素數,就輸出prime 如果n不是素數,就輸出not prime。sample input 97 sample output p...