一种比较简单的判断素数的方法

最近学习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;
        }    
    }
}

当然,与大神们的代码比起来,我的可以说是小学生水平。不过对于不刷题的我来说已经足够了。

posted @ 2016-03-12 18:44  Releasing  阅读(2798)  评论(0编辑  收藏  举报