一、判断一个数是否是素数?
public boolean isPrimeNumber(int num){ if(num == 2) return true; //2特殊处理 if(num < 2 || num % 2 == 0) return false; //识别小于2的数和偶数 for(int i=3; i<=Math.sqrt(num); i+=2){ if(num % i == 0){ //识别被奇数整除 return false; } } return true; }
质数的定义:质数(prime number)又称为素数,有无限多个。质数定义在大于1的自然数中,除了1和它本身以外不会再有其它因数的数称为质数。
(1)从2开始,2是最小的质数。
(2)除了2之外的偶数全都不是质数,因为除了1和自身之外它们还能被2整除。若为大于2的奇数,则进入下一步继续判断。
(3)将其开方,若从3到开方向下取整之间的所有奇数都不能将其整除,则说明该数为质数。
至于为什么只用除到其平方根?
因为如果一个数不是素数是合数,那么一定可以由两个自然数相乘得到,其中一个大于或等于它的平方根,一个小于或等于它的平方根。
二、三种素数之间的比较?
package Java基础; public class TestPrime { public static void main(String[] args) { long startTime1 = System.currentTimeMillis(); for(int i=1;i<=100;i++){ if(isPrime1(i)){ System.out.print(i+" "); } } long endTime1 = System.currentTimeMillis(); System.out.println("方式一消耗时间:"+(endTime1-startTime1)); long startTime2 = System.currentTimeMillis(); for(int i=1;i<=100;i++){ if(isPrime2(i)){ System.out.print(i+" "); } } long endTime2 = System.currentTimeMillis(); System.out.println("方式二消耗时间:"+(endTime2-startTime2)); long startTime3 = System.currentTimeMillis(); for(int i=1;i<=100;i++){ if(isPrime3(i)){ System.out.print(i+" "); } } long endTime3 = System.currentTimeMillis(); System.out.println("方式三消耗时间:"+(endTime3-startTime3)); } /* * 1. 根据概念判断: 如果一个正整数只有两个因子, 1和p,则称p为素数. 时间复杂度O(n). */ public static boolean isPrime1(int n) { if (n < 2) return false; for (int i = 2; i < n; ++i) if (n % i == 0) return false; return true; } /* * 2. 改进, 去掉偶数的判断 时间复杂度O(n/2), 速度提高一倍. */ public static boolean isPrime2(int n) { if (n < 2) return false; if (n == 2) return true; if (n % 2 == 0) return false; for (int i = 3; i < n; i += 2) if (n % i == 0) return false; return true; } /* * 3. 进一步减少判断的范围 定理: 如果n不是素数, 则n有满足1< d<=sqrt(n)的一个因子d. 证明: 如果n不是素数, 则由定义n有一个因子d满足1< d< n. 如果d大于sqrt(n), 则n/d是满足1< n/d<=sqrt(n)的一个因子. 时间复杂度O(Math.sqrt(n)/2), 速度提高O((n-Math.sqrt(n))/2). */ public static boolean isPrime3(int n) { if (n < 2) return false; if (n == 2) return true; if (n % 2 == 0) return false; for (int i = 3; i * i <= n; i += 2) if (n % i == 0) return false; return true; } }
参考:https://blog.csdn.net/ahem_/article/details/65939250
参考:https://blog.csdn.net/kp_liu/article/details/37569507