[英]Initialization of boolean variable while using “for” loop in Java
我有一个有趣的问题。 我正在编写一个程序来打印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
这是错误的。 但是,如果我初始化布尔变量boolean isPrime = true;
在第一个for循环中,我得到了质数的正确列表。 谁能帮助我了解为什么布尔变量初始化的位置会影响输出?
您需要考虑该变量的含义。 我想大概的意思是“是的当前值a
数?”。 然后,每当a
取一个新值时,您都需要重新开始,并且-根据您的方法-将其作为主要处理,直到您证明并非如此。
如果您在第一个for
循环之前对其for
初始化,您实际上是在问:“到目前为止,我所见过的a
所有值是否都是质数?”。 显然,对于2和3来说,这是正确的,但是一旦您评估4,它就会被设置为false并永远存在。
这实际上与变量本身在何处初始化无关。 您可以保留它的位置,只要在进入内部for
循环之前为它分配一个true
值即可。 最重要的一点是,每个值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);
}
}
}
原因是,一旦找到一个非素数, isPrime
变量就会设置为false
,而对于变量a
所有其他值,它将保持为false
。 正如您已经正确发现的那样,您需要为每个新a
值将isPrime
重置为true
,即在外部循环中对其进行初始化。
这很容易。 您的逻辑起作用,因此除非您发现内部循环中有一个除数(因此它不是质数),否则您假定该数字是质数。
问题是,一旦找到非质数(例如4),则布尔值将永远永远为假,并且不会打印其他质数。
因此,必须像尝试的那样在外部for循环中将布尔值重置为true。 这确保了检查每个主要候选者的逻辑相同:
初始化后,一旦在内部循环中将boolena var设置为false,则在内部循环中将其设置为false,在下一个del del外部循环中,无论数字是否为质数,都不会被打印,从而导致var仍然为false,即因为您需要在每次外部循环开始时重新初始化var,那就是将其放入外部循环中(如您所说的第一个for循环)
我希望这会有所帮助,请原谅我的英语我不是母语人士!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.