我不明白这个'因为' Java

时间:2016-04-10 02:59:56

标签: java if-statement for-loop boolean primes

我不明白这个'因为' 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;

}

1 个答案:

答案 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以外的除数,小于或等于其平方根。