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

时间:2016-02-26 16:40:12

标签: 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,这是错误的。但是,如果我在第一个for循环中初始化布尔变量boolean isPrime = true;,我会得到正确的素数列表。任何人都可以帮助我理解为什么布尔变量初始化的位置会影响输出??

4 个答案:

答案 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值重置isPrimetrue,即在外部循环内对其进行初始化。

答案 2 :(得分:0)

很容易。你的逻辑是有效的,你假设数字是素数,除非你发现它在内循环中有一个除数(所以它不是素数)。

问题在于,一旦找到非素数(例如4),布尔值将永远保持为假,并且不会打印其他素数。

因此,您必须在尝试时将外部for循环内的布尔值重置为true。这可以确保检查每个主要候选人的工作原理是相同的:

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

答案 3 :(得分:0)

正如你在内部循环中将boolena var初始化为外部循环一次将其设置为false,在下一个del del外循环中,无论数字是否为素数,它都不会是printes因为var仍然是是的,因为你需要在每次外部循环开始时重新初始化var,这就是把它放到外部循环中(如你所说的第一个for循环)

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