我不理解Java 中的"for"循环
这个循环只是检查一个数字是否素数。我理解第一个语句,因为1不是素数,但它是"for"语句中发生的情况。为什么"素数"被二除,为什么第二个"如果"计算的余数为零?这个代码如何帮助确认素数?它在做什么?
public static boolean isPrime (int primeNumber) {
if (primeNumber == 1) {
return false;
}
for (int primeDivider=2; primeDivider <= primeNumber/2; primeDivider++) {
if (primeNumber % primeDivider == 0) {
return false;
}
}
return true;
}
素数只能被自身和一整除。7是素数,因为只有1和7除以7。8也不是素数,因为除了1和8之外,2和4都被分成8。
查看for
循环,看看primeDivider
取什么值:2、3、4、5。。。循环依次尝试其中的每一个,看看它是否划分为您正在测试的数字。如果它等分,余数为0,则被测数字不是素数,该方法返回false
。如果没有一个数字除,则被测试的数字为素数,该方法返回true
。顺便说一句,primeNumber
是一个糟糕的变量名。像possiblePrime
这样的东西会更好。正在测试的数字可能不是素数。
primeDivider
序列在被测数字的一半处停止。如果一个数不是素数(一个复数),那么它的至少一个除数保证小于或等于这个数的一半。
正如其他人所说,这不是一个非常有效的测试。这里有一个稍微高效的版本供您研究:
public static boolean isPrime (int possiblePrime) {
// Test negatives, zero and 1.
if (possiblePrime <= 1) {
return false;
}
// Test even numbers
if (possiblePrime % 2 == 0) {
// 2 is the only even prime.
return possiblePrime == 2;
}
// Test odd numbers >= 3.
int limit = possiblePrime / 2;
for (int primeDivider = 3; primeDivider <= limit; primeDivider += 2) {
if (possiblePrime % primeDivider == 0) {
return false;
}
}
// Only prime numbers reach this point.
return true;
}
通过分别处理奇数和偶数,您可以通过一次测试捕获所有偶数,并通过每次将primeDivider
步进2,将奇数所需的时间大致减半。
正如billjamesdev所说,使用可以提高效率
int limit = (int)Math.floor( Math.sqrt( possiblePrime ));
一个复合数总是有一个除数,而不是1,小于或等于它的平方根。