【问题标题】:I don't understand this 'for' loop for prime number validation in Java我不明白这个用于 Java 中素数验证的“for”循环
【发布时间】:2016-04-10 02:59:56
【问题描述】:

我不理解 Java 中的这个“for”循环

这个循环只是为了检查一个数字是否是素数。我理解第一个语句,因为 1 不是质数,而是“for”语句中发生的情况。为什么'primeNumber'被二除,为什么第二个'if'计算余数为零?此代码如何帮助确认素数?它在做什么?

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;

}

【问题讨论】:

  • 检查 2->num/2 中的数字是否除以无余数为 num(正在测试的数字)。
  • 这个问题不太适合 StackOverflow。尝试浏览 http://mathoverflow.net/ 或网络上的任何其他数学资源,了解质数的工作原理。
  • 如何判断一个数是否为素数?它几乎肯定会这样做,并进行一些优化。检查 563 是否为素数时,您会尝试除以 2、3、4、5、6 等,对吗?只有当你检查了它是否能被 2 整除后,你才需要检查它是否能被 563/2 或更多整除,对吗?提示...您可以将 primeNumber/2 替换为 Math.floor( Math.sqrt( primeNumber ))
  • 提示:素数(或素数)是大于 1 的自然数,除 1 和自身之外没有正除数。想想这和%之间的关系。

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


【解决方案1】:

素数只能被它自己和一整除。 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 以外,小于或等于它的平方根。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多