【问题标题】:Explanation to isPrime() methodisPrime() 方法说明
【发布时间】:2020-10-31 10:57:04
【问题描述】:

有人可以帮助我澄清当整数通过此方法时会发生什么,因为我很难理解。谢谢!

    public static boolean isPrime(int n) {
            if (n == 1) {
                return false;
            }
    
            for (int i=2; i<= n/2; i++) {
                if (n % i == 0) {
                    return false;
                }
            }
   
            return true;
        }
    }

【问题讨论】:

  • 5这样的具体数字试一试,然后逐行逐句通过代码并理解每一步。
  • 不幸的是,这个算法是有缺陷的。 n/2 真的应该是 Math.sqrt(n)+1 但其余的都是合理的尝试。你还需要知道% 做了什么。
  • @WSJ 它为 n == 0 返回 true,这也是不正确的
  • @ParkerThompson 查看this 以了解更好的实现。
  • 素数是任何(正?)整数,只能被它自己和 1 整除。

标签: java for-loop methods boolean primes


【解决方案1】:

当您将数字传递给函数时,首先要快速检查1 的情况,它不是素数,并且可以除以所有其他正整数而没有余数。所以,这是特别检查的情况:

if (n == 1) {
    return false;
}

然后,在 for 循环中,您正在检查给定的数字是否可以被任何整数整除,最多可以是给定数字的一半,这使我们能够确定它是否是素数。如果它是可整除的,那么它不是素数,返回false。检查一个数是否可​​整除的方法是使用mod operator

但是有一个问题;正如@WJS在评论部分所说,您不需要检查从Wikipedian / 2的所有数字:

要通过试除法检验 100 的素数,请考虑所有 100的整数除数:

2, 4, 5, 10, 20, 25, 50 最大因数是 100/2 = 50。这是真的 对于所有 n:所有除数都小于或等于 n/2。检查 除数,确定其中一些是多余的。名单 的除数可以写成:

100 = 2 × 50 = 4 × 25 = 5 × 20 = 10 × 10 = 20 × 5 = 25 × 4 = 50 × 2 这证明了冗余。一旦除数 10 被测试, 这是√100,第一个除数只是前一个的被除数 除数。因此,测试除数大于 √n 可以是 被淘汰了。

因此,您的代码可以通过以下方式更高效:

for (int i = 2; i < Math.sqrt(n)+1; i++) {
    if (n % i == 0) {
        return false;
    }
}

最后,如果你的数不能除以平方根以内的任何数,则表示它是素数,所以返回 true。

【讨论】:

  • 非常感谢@Sercan 的帮助,但是如果变量 n 等于不能被 2 整除的非质数(例如 15 或 21)会怎样?跨度>
  • 对于 15 Math.sqrt(n)+1 = 4.87;你的循环就像for (int i = 2; i &lt; 4.87; i++)。这意味着将有2、3和4的迭代。2不能除,但3除而无余,所以条件if (15 % 3 == 0)为真,因此方法将返回假。 21 的逻辑相同。最好在调试时在 IDE 中尝试这些选项以查看行为。我想这会更清楚。如果有用或回答您的问题,请考虑投票和/或接受答案:)
猜你喜欢
  • 2010-09-13
  • 2013-11-10
  • 2011-12-24
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2012-09-24
相关资源
最近更新 更多