一种比较简单的判断素数的方法
最近学习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; } }
}
当然,与大神们的代码比起来,我的可以说是小学生水平。不过对于不刷题的我来说已经足够了。