最近學習java開發的時候遇到了求素數的問題。對於從來沒有寫過算法的我來說寫這種題也是十分捉急啊。(寶寶其實連素數是什么都不知道。。。)
在網上找了好久,終於找到了一種既能讓我看懂又不至於太low的求解方法。
首先說一說什么是素數,素數又叫質數。下面是來自百度百科的定義:除了1和它本身以外不再有其他的除數整除。根據算數基本定理,每一個比1大的整數,要么本身是一個質數,要么可以寫成一系列質數的乘積,最小的質數是2。
知道了什么是素數,就要說一說怎么判斷的問題了。很明顯 1 不是素數, 2 是素數。那么更大的數呢?
我們首先想到的是讓待判斷的數(這里假設是 n)依次除以從 3~n 的所有整數,如果有能夠除盡的情況,那么這個數就不是素數。
接下來,很容易能證得任意一個比 n/2 更大的整數除 n 的話,結果都不能除盡。所以判斷條件的上限可以縮小到 n/2。
另外又有人證明(具體是誰我也不知道( ̄▽ ̄)")任何一個比 根號n 大的整數除 n 也是除不盡的。所以上限可以縮小到 根號n。
又,我們知道偶數(除2外)不是素數,因此步進長度可以設為2。
以上就是所有的優化了,下面上代碼:
public class PrimeNumber { public static boolean isPrime(int n) { if(n < 3) // 小於3的時候判斷是1還是2 return n > 1; else if(n % 2 == 0) // 偶數 return false; else { // 其他情況,依然是依次去除,但是少了許多數 int sqrtn = (int)Math.sqrt((double)n); for(int i = 3; i <= sqrtn; i+=2){ if(n%i == 0) return false; } return true; } }
}
當然,與大神們的代碼比起來,我的可以說是小學生水平。不過對於不刷題的我來說已經足夠了。