我有一个有趣的问题。我正在编写一个程序来打印1到100之间的素数。首先让我告诉你我的代码:
public class Lessons {
public static void main(String[] args) {
int b;
boolean isPrime = true;
for (int a=2; a<=100; a++) {
for (b=2; b<a;b++) {
if (a%b==0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.println(a);
}
}
}
}
此程序的输出为2 3
,这是错误的。但是,如果我在第一个for循环中初始化布尔变量boolean isPrime = true;
,我会得到正确的素数列表。任何人都可以帮助我理解为什么布尔变量初始化的位置会影响输出??
答案 0 :(得分:1)
您需要考虑该变量的含义。我认为这可能意味着&#34;是a
素数的当前值?&#34;。然后,每当a
获得一个新值时,您需要重新开始,并且 - 根据您的方法 - 将其视为素数,直到您证明它不是。
如果您在第一个for
循环之前对其进行初始化,那么您真正要求的是{到目前为止我见过的a
的所有值?&# 34 ;.显然,对于2和3都是如此,但是一旦你评估4,它就会被设置为false并永远保持在那里。
这与变量初始化本身的位置无关。只要在进入内部true
循环之前为其分配值为for
,就可以将其保留在原来的位置。重要的一点是a
的每个值都有机会根据自己的优点进行评估,而不会带来先前值的结果。
所以这会奏效:
public static void main(String[] args) {
int b;
boolean isPrime;
for (int a=2; a<=100; a++)
{
isPrime = true;
for (b=2; b<a;b++)
{
if (a%b==0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
System.out.println(a);
}
}
}
答案 1 :(得分:1)
原因是,一旦找到一个非素数,您的isPrime
变量就会设置为false
,而变量{{1}的所有其他值仍为false
}}。在您正确发现之后,您需要为每个新的a
值重置isPrime
到true
,即在外部循环内对其进行初始化。
答案 2 :(得分:0)
很容易。你的逻辑是有效的,你假设数字是素数,除非你发现它在内循环中有一个除数(所以它不是素数)。
问题在于,一旦找到非素数(例如4),布尔值将永远保持为假,并且不会打印其他素数。
因此,您必须在尝试时将外部for循环内的布尔值重置为true。这可以确保检查每个主要候选人的工作原理是相同的:
答案 3 :(得分:0)
正如你在内部循环中将boolena var初始化为外部循环一次将其设置为false,在下一个del del外循环中,无论数字是否为素数,它都不会是printes因为var仍然是是的,因为你需要在每次外部循环开始时重新初始化var,这就是把它放到外部循环中(如你所说的第一个for循环)
我希望它会有所帮助,原谅我的英语,我不是母语人士!