繁体   English   中英

在Java中使用“ for”循环时初始化布尔变量

[英]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。 这确保了检查每个主要候选者的逻辑相同:

  • 首先我们假设候选人是素数
  • 除非我们在内部for循环中证明它不是

初始化后,一旦在内部循环中将boolena var设置为false,则在内部循环中将其设置为false,在下一个del del外部循环中,无论数字是否为质数,都不会被打印,从而导致var仍然为false,即因为您需要在每次外部循环开始时重新初始化var,那就是将其放入外部循环中(如您所说的第一个for循环)

我希望这会有所帮助,请原谅我的英语我不是母语人士!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM