我不明白这个'因为' Java中的循环
此循环仅用于检查数字是否为素数。我理解第一个陈述,因为1不是素数,但它是' for'声明。为什么' primeNumber'除以二,为什么第二个'如果'计算余数为零?这段代码如何帮助确认素数?它在做什么?
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;
}
答案 0 :(得分:0)
素数只能由它自己和一个除。 7是素数,因为只有1和7分为7.还有8不是素数,因为除了1和8,2和4都分为8。
查看for
循环并查看primeDivider
占用的值:2,3,4,5 ......循环依次尝试每个值以查看它是否分为数字你正在测试。如果它均匀分配,余数为0,那么被测试的数字不是素数,方法返回false
。如果没有数字除以,则在prime中测试的数字和方法返回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以外的除数,小于或等于其平方根。