【问题标题】:I do not understand the logic behind this prime number checker (Java)我不明白这个素数检查器(Java)背后的逻辑
【发布时间】:2015-05-03 22:10:47
【问题描述】:

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

代码如下:

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

//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

非常感谢您的帮助,感谢您的阅读。

【问题讨论】:

  • 你遍历所有is 检查它们是否是 Prime,你首先默认为“是”(true),如果你发现一个 ji 分开 - 你将其设置为false。这里的所有都是它的。至于第二个混淆,当i == 2 时,第二个循环将不会运行(因为你从 j=2 开始并在 j
  • 哦,哇,我完全想太多了。我有一个非常愚蠢的印象,即第二个 for 循环必须运行。感谢您的回复。
  • 抱歉,我的意思是用类似“i%2 == 0”之类的东西检查两个是否均匀进入
  • 所以当“i = 10”归结为循环时,10 被 2 均匀除以所以布尔值返回 false?第二个 for 循环是否总是以“j = 2”开头,所以在第二个循环中运行的所有数字都除以 2 并返回余数?
  • @Jyr - 这绝对是不是埃拉托色尼的筛子。如果i 通过了j = 2 的测试,它仍然会检查j = 4(假设i 足够大),即使它不可能被4 整除,如果它不能被2 整除。筛子的全部目的是通过排除这种“不可能”的测试来节省时间。还值得指出的是,如果isPrime 变为false,内部循环应该立即停止,而不是继续直到j 超过i 的平方根。

标签: java numbers finder


【解决方案1】:

让我们逐行浏览。

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 &gt; i 这是不可能的。

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

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

}

所以,如果我们还有isPrime == true,说明当前号码经受住了我们的测试,我们可以打印出来。

两个进一步的改进;

  1. 一旦我们知道这个数不是素数,就不需要检查任何 额外的除数,所以我们想退出循环,因此 可以添加break; 语句。
  2. 2only 偶数素数,所以你也可以 在j == 3 开始第二个循环,每次执行后增加2。 然后您必须单独考虑i == 2 时的情况。

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多