我的isPrime方法有什么问题?

这是我的isPrime方法:

 private static boolean isPrime(int num) { if (num % 2 == 0) return false; for (int i = 3; i * i < num; i += 2) if (num % i == 0) return false; return true; } 

我把isPrime(9)并返回true 。 这个方法有什么问题?

你的病情应该是i * i <= num

 private static boolean isPrime(int num) { if (num < 2) return false; if (num == 2) return true; if (num % 2 == 0) return false; for (int i = 3; i * i <= num; i += 2) if (num % i == 0) return false; return true; } 

您没有在考虑中使用数字9,因此9 <9将导致错误。 但你需要检查9。

我的样本:

 public boolean isPrime(int x) { if (x==1) { return true; } else { for(int i=2;i<=Math.sqrt(x);i++) { if (x%i==0) return false; } return true; } 

Java 8 :(使用lambda表达式和流的示例)

 public static boolean isPrimeFunctionalStyle(int number) { return number > 1 && IntStream.rangeClosed(2, (int) Math.sqrt(number)) .noneMatch(i -> number % i == 0); } 

以下是一些提示:

  1. 主要的错误是你永远不会通过sqrt(num)检查可分性,因为循环中有一个错误的错误。

  2. 另一个错误是你不认为2是素数(它是)。

(晚)Sidenode:

 private static boolean isPrime(int num) { if (num % 2 == 0) return false; for (int i = 3; i * i < num; i += 2) if (num % i == 0) return false; return true; } 

此代码缺失2 ; 2是素数。 2可分割的所有东西都不是,除了2 - 所以,使用:

 private static boolean isPrime(int num) { if (num == 2) return true; if (num % 2 == 0) return false; for (int i = 3; i * i < num; i += 2) if (num % i == 0) return false; return true; } 

像这样更改你的代码(检查条件):

  private static boolean isPrime(int num) { if (num == 2) return true; if (num % 2 == 0) return false; for (int i = 3; i * i <= num; i += 2) if (num % i == 0) return false; return true; } 

i * i < num的循环条件应为i * i <= num

循环永远不会执行,所以它直接返回true

循环不运行。 它在i的第一个值中终止,因为3 x 3 = 9它不满足条件i * i

  for (int i = 3; i * i < num; i += 2) if (num % i == 0) return false; 

i * i是9,而9不小于9,因此循环不运行。

你可以简单地使用if和else语句来检查数字是否为素数。 有一种模式,一旦数量达到一定限度,所有数字都是2或3的倍数。

 public static boolean isPrime2 (int n) { if (n == 1) { return false; } else if (n == 2 || n==3) { return true; } else if (n>2) { if(n % 2 ==0 || n % 3 == 0) { return false; } } return true; } 
 public static boolean isPrime (int number) { if(number < 2) { return false; } int check = (int) Math.sqrt(number); for(int i = 2; i <= check; i++) { if(number % i == 0) { return false; } } return true; }