我的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); }
以下是一些提示:
-
主要的错误是你永远不会通过
sqrt(num)
检查可分性,因为循环中有一个错误的错误。 -
另一个错误是你不认为
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; }