由于声明不正确导致输出错误?

时间:2017-09-04 15:55:18

标签: java

我正在执行代码以显示从1到100的素数。当我执行以下代码时,它不会显示所有数字。这是代码

public class PrimeNumberSeries {

    public static void main(String[] args) {
         boolean flag = true;
        for(int i=1; i <= 100; i++){
                for(int j=2; j<= i-1; j++){
                  if(i%j==0){
                    flag = false;
                    break;
                }
            }
            if(flag == true){
                System.out.println("The number is prime number. Value = "+ i);
            }
        }

    }

}

我对flag变量的声明感到困惑。如果我在第一个for循环中声明变量,那么程序会向我显示正确的输出,即

for(int i=1; i <= 100; i++){
                 boolean flag = true;
                    for(int j=2; j<= i-1; j++){

背后的原因是什么? 如果变量在main方法上方声明为Class变量(static boolean flag),那么它也会显示相同的输出。

4 个答案:

答案 0 :(得分:2)

boolean flag = true;的forLoop内初始化i,确保j的每个增量再次为flag分配值true。这就是正确的实现,因为您假设最初的数字为:i是primeNumber,当您找到它的任何除数时,您可以flag=false

答案 1 :(得分:1)

如果在您的循环外宣布boolean flag,则每个true的{​​{1}}都不会重置为Integer i。因此,boolean flag更改为false后,对于每个false,它将保持Integer i。在循环内部声明它确保每次都重置为true

答案 2 :(得分:0)

第二个是正确的。

第一个版本中的问题是因为有时flag未在循环中更改,因此使用初始化值。 以不同的方式说:具有之前(或之前的一些)检查的价值。

或者在伪代码中正确的算法是:

for every number from 1 to 100
   assume is prime
   check, maybe have dividor -> not prime
   print

答案 3 :(得分:0)

您不需要检查j值直到j <= i-1

for(int j=2; j<= i-1; j++)

你需要直到 j&lt; = Math.sqrt(i)

以下是针对您的用例的小优化解决方案。

int  n=100;
System.out.println("All Prime Numbers Between 1 to "+n);
boolean isPrime;

for (int i = 2; i <= n; i++) {
    isPrime = true;
    for (int j = 2; j <=Math.sqrt(i); j++) {
        if (i % j == 0) {
            isPrime = false;
            break;
        }
    }

    if (isPrime)
        System.out.print(i + " ");
}