这里我写了几个求素数的方法和大家交流一下
// ① 进行穷举 时间复杂度O(n)
private static boolean primer1(int number) { for(int i = 2 ; i < number -1 ; i++ ){ if(number%i == 0){ return false ; } } return true; }
// ② 使用 √n 进行计算 时间复杂度O(√n)
private static boolean primer2(int number) { // 这里我们使用 i*i 而不使用 Math.sqrt(number) 因为求根是一个非常耗时的操作 for (int i = 2; i*i<number; i++) { if(number%i == 0){ return false ; } } return true; }
// ③ 使用爱拉托逊斯算法 充分利用了一素数的定义 如果一个数 m 是 另一个数 n 的倍数则这个数肯定不是素数 时间复杂度
private static boolean primer3(int number) { boolean[] prime = new boolean[number]; for (int i = 2; i < prime.length - 1; i++) { if(!prime[i-1]) for (int j = i - 1; j < prime.length; j += i) prime[j] = true ; } return !prime[number-1]; }
/// ④ 如第三个算法 其时间复杂度已经是非常小了,但是对内存的要求确实非常大的,我们可以使用√n 的算法和爱拉托逊斯算法进行结合计算的数越大对内存的压力减少越明显
扫描二维码关注公众号,回复:
1190105 查看本文章
对于2到√n 还是有很多的数是不用进行计算的 ,如 2 4 6 8 , 其中2的倍数都不用进行计算
private static boolean primer4(int number) { int k = (int) Math.sqrt(number); boolean[] isprime = new boolean[k] ; for (int i = 2; i <= k; i++) { if(isprime[i-1]){ if(number%i == 0) return false ; for (int j = 0; j < k; j += j) { isprime[j-1] = true ; } } } return true; }