一種比較簡單的判斷素數的方法


最近學習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;
        }    
    }
}

當然,與大神們的代碼比起來,我的可以說是小學生水平。不過對於不刷題的我來說已經足夠了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM