判斷一個數是不是質數(素數),3種方式介紹
一、概念介紹
大家中學都學過,就不過多介紹了,大致提兩點:
質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。
0和1既不是質數也不是合數,最小的質數是2
二、方法介紹
1.最直觀,但效率最低的寫法
public static boolean isPrime(int n){
if (n <= 3) {
return n > 1;
}
for(int i = 2; i < n; i++){
if (n % i == 0) {
return false;
}
}
return true;
}
這裡特殊處理了一下小於等於3的數,因為小於等於3的自然數只有2和3是質數。
然後,我們只需要從2開始,一直到小於其自身,依次判斷能否被n整除即可,能夠整除則不是質數,否則是質數。
2.初步優化
假如n是合數,必然存在非1的兩個約數p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。由此我們可以改進上述方法優化迴圈次數。如下:
public static boolean isPrime(int n) {
if (n <= 3) {
return n > 1;
}
int sqrt = (int)Math.sqrt(n);
for (int i = 2; i <= sqrt; i++) {
if(n % i == 0) {
return false;
}
}
return true;
}
3.繼續優化
我們繼續分析,其實質數還有一個特點,就是它總是等於 6x-1 或者 6x+1,其中 x 是大於等於1的自然數。
如何論證這個結論呢,其實不難。首先 6x 肯定不是質數,因為它能被 6 整除;其次 6x+2 肯定也不是質數,因為它還能被2整除;依次類推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那麼,就只有 6x+1 和 6x+5 (即等同於6x-1) 可能是質數了。所以迴圈的步長可以設為 6,然後每次只判斷 6 兩側的數即可。
public static boolean isPrime(int num) {
if (num <= 3) {
return num > 1;
}
// 不在6的倍數兩側的一定不是質數
if (num % 6 != 1 && num % 6 != 5) {
return false;
}
int sqrt = (int) Math.sqrt(num);
for (int i = 5; i <= sqrt; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
}
return true;
}
對於輸入的自然數 n 較小時,也許效果不怎麼明顯,但是當 n 越來越大後,該方法的執行效率就會越來越明顯了。
---------------------
作者:阿飛__
來源:CSDN
原文:https://blog.csdn.net/afei__/article/details/80638460
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關文章
- 【數學問題】判斷一個數是否是素數
- C語言判斷素數,判斷質素演算法C語言演算法
- 判斷素數
- 素數判斷
- 【質數判斷】給定兩個數,判斷這兩個數是否互質?
- 判斷一個數是否為質數(程式碼)
- 使用python判斷某個數是不是素數及輸出100以內的所有素數Python
- Python 判斷質數的另一種方法Python
- 質數判斷、質因子分解、質數篩
- 質數的判斷
- L1-028 判斷素數 分數 10
- JavaScript判斷數字是否是質數JavaScript
- 判斷一個字串/整數是不是迴文 2020-11-10字串
- 演算法學習記錄02-判斷輸入數字是不是質數演算法
- 一文解決如何使用 C 語言判斷質數(素數)[ 附解析與原始碼 ]原始碼
- php判斷變數是不是null的方法PHP變數Null
- python如何判斷一個數是否是整數Python
- 輸出一個區間內的質數(素數)
- 大數模擬 加減乘除 判斷大數是否為素數 板子
- python怎麼判斷一個數是幾位數Python
- wenbao與篩法素數及判斷模板
- js之普通/高效判斷質數JS
- Python:判斷一個正整數是否為迴文數Python
- python 輸入一個整數,判斷其是否既是3的倍數,又是5的倍數Python
- 判斷一個數為哪些數的階乘之和(貪心)
- 判斷一個數N能否同時被3和5整除;
- 每日codewars題之判斷一個數是否是水仙花數
- 位運算-判斷一個數是否為2的整數次方
- 與數論的愛恨情仇--01:判斷大素數的Miller-Rabin
- C#判斷一個字串是否是數字或者含有某個數字C#字串
- 如何判斷一個數倉模型的好壞?模型
- 原生js 判斷變數是一個陣列JS變數陣列
- 編寫類 AA ,有一個方法:判斷一個數是奇數 odd 還是偶數, 返回 booleanBoolean
- nginx判斷路徑是否含有某個引數做判斷Nginx
- JavaScript判斷兩個變數是否相等JavaScript變數
- JavaScript判斷變數型別的四種方法JavaScript變數型別
- JQuery 判斷 正整數jQuery
- 變數,運算子,if判斷變數