我不明白这个素数检查器(Java)背后的逻辑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我不明白这个素数检查器(Java)背后的逻辑相关的知识,希望对你有一定的参考价值。

我不明白这个数字检查器背后的逻辑,我想知道是否有人可以帮助我更好地理解它。

这是代码:

我会尽力评论正在发生的事情,但我并不完全理解。

//find prime numbers between 2 and 100

class PrimeNumberFinder {
    public static void main(String args[]) {

        int i, j; // declare the integer variables "i" and "j"
        boolean isPrime; // declare the Boolean variable is prime but do not assign value

        // create a for loop that starts at two and stops at 99.
        for (i=2; i < 100 ; i++) {
            isPrime = true; // I do not know why isPrime is set to true here.
            // This is where I get confused badly.. we give the "j" variable a value of two and check to see if it's less than whatever "i" divided by "j" is.             
            // If "i=2" then how would j (which is = 2) be less than or equal to i/j (2/2)? 

            for (j = 2; j <= i/j; j++)
                if ((i%j) == 0) isPrime = false; // If a certain number goes in evenly that isn't 1, or "i" itself, it isn't prime so we set the boolean to false

            if (isPrime) // if true print i
                System.out.println(i + " Is a prime number");


        }
    }
}

你可以看到第二个for循环,几乎所有内容都让我感到困惑,特别是“j <= i / j”,因为对我来说j总是会变得更大......为什么“j”甚至会增加?难道你不能把它除以两个并确定它是否是这样的素数?

非常感谢任何帮助,谢谢你的阅读。

答案

让我们一行一行地完成它。

int i, j;
boolean isPrime;

我们首先声明我们的变量。没什么太花哨的。

for (i=2; i < 100; i++) {
    isPrime = true;

在这里我们输入我们的循环,基本上包含我们要检查的所有数字(这里:2 - 99)。我们还声明当前的数字是素数(除非另有证明)。

    for (j = 2; j <= i/j; j++)
        if ((i%j) == 0) isPrime = false;

现在这里是魔术发生的地方。我们将检查是否可以将当前数字i均匀地除以从j == 2i/j的任何整数(i/j最终只是编写Math.sqrt(i)的一种奇特方式)。那么为什么要到那儿为止?

好吧,说我们有两个除数ab这样a * b = i。现在,如果除数a大于i的平方根,那么另一个除数b将小于i的平方根。如果没有那么a * b > i,这是不可能的。

所以,如果我们能找到一个可以均匀划分的情况,这明确意味着当前数字不是素数,我们将isPrime变量设置为false

    if (isPrime) // if true print i
        System.out.println(i + " Is a prime number");

}

所以,如果我们仍然有isPrime == true,这意味着当前的数字经受住了我们的测试,我们可以打印它。

两个进一步改进;

  1. 一旦我们知道数字不是素数,就没有必要检查任何额外的除数,所以我们想要退出循环,因此可以添加break;语句。
  2. 2是唯一的素数,所以或者你可以在j == 3开始第二个循环,并在每次执行后增加2。然后你必须分别考虑i == 2的情况。

以上是关于我不明白这个素数检查器(Java)背后的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

代码背后的逻辑确定两个 javascript 字符串是不是是字谜

本机退出代码:-1073741510 (0xc000013a),同时使用素数检查器功能

如何将素数检查器实现到我需要计算素数的数组中?

Weaviate的KNN分类算法背后的逻辑是啥?

Asp.net 寻呼机点击事件未触发,其背后的逻辑是啥?

SQL - 人类可读性极强,但我不明白它背后的概念