我不明白这个数字检查器背后的逻辑,我想知道是否有人可以帮助我更好地理解它。
以下是代码:
我会尽力评论发生的事情,但我并不完全理解。
//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&lt; = i / j”,因为对我来说j总是会变得更大......为什么是“j”甚至增加?难道你不能把它除以两个并确定它是否是这样的素数?
非常感谢任何帮助,感谢您阅读。
答案 0 :(得分: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 == 2
到i/j
之间的任何整数(i/j
最终只是一种奇特的写作方式{{ 1}})。那么为什么要到那里呢?
嗯,说我们有两个除数Math.sqrt(i)
和a
,b
。现在,如果除数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
声明。break;
是唯一的偶数素数,所以您也可以
在2
开始第二个循环,并在每次执行后增加j == 3
。
然后,您必须单独考虑2
。