1. 概念介绍
- 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。
- 0和1既不是质数也不是合数,最小的质数是2。
2. 代码和结果
/**
* @author LanceQ
* @version 1.0
* @time 2021/5/19 12:53
*/
public class PrimeNumberDemo {
public static void main(String[] args) {
int i=13;
Boolean b=PrimeNumber1(i);
System.out.println("初始:"+b);
Boolean b2=PrimeNumber2(i);
System.out.println("优化:"+b2);
Boolean b3=PrimeNumber3(i);
System.out.println("进一步优化:"+b3);
}
private static Boolean PrimeNumber3(int n) {
if(n<=3){
return n>1;
}
if(n%6!=1&&n%6!=5){
return false;
}
int sqrt= (int) Math.sqrt(n);
for (int i = 2; i <= sqrt; i++) {
if(n%i==0){
return false;
}
}
return true;
}
private static Boolean PrimeNumber2(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;
}
private static Boolean PrimeNumber1(int i) {
if(i<=3){
return i>1;
}
for (int j = 2; j < i; j++) {
if(i%j==0){
return false;
}
}
return true;
}
}
运行结果:
初始:true
优化:true
进一步优化:true
执行的方法代码和结果如上:
方法一:
- PrimeNumber1方法是最直观,对于特殊的数据2、3在一开始进行简单的处理,才进行后面的判断,因为小于等于3的自然数只有2和3是质数。
- 在后面,我们只需要从2开始,一直到小于其自身,依次判断能否被n整除即可,能够整除则不是质数,否则是质数。
方法二:
- PrimeNumber2方法,假如n是合数,必然存在非1的两个约数p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。由此我们可以在方法一的基础上优化循环次数,提高效率。
方法三:
- PrimeNumber3方法,其实质数还有一个特点,就是它总是等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。
- 所以, 6x 肯定不是质数,因为它能被 6 整除;其次 6x+2 肯定也不是质数,因为它还能被2整除;依次类推,6x+3 肯定能被 3 整除;6x+4 肯定能被 2 整除。那么,就只有 6x+1 和 6x+5可能是质数了。所以只需要在进行循环之前,先进行判断,如果该数对6取模即不等于1也不等于5的话,就一定不是质数,可以直接返回false。
参考::https://blog.csdn.net/afei__/article/details/80638460