素数计算中的错误

时间:2019-07-01 07:46:31

标签: java primes

我正在尝试打印2到100之间的所有素数,但我只得到2到3。

我已经尝试了所有可能的替代方法,但是它都带有不同的错误或不同的输出。

public static void main(String[] args) {
    boolean flag = true;
    for (int i = 2; i <= 100; i++) {
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                flag = false;
                break;
            }
        }

        if (flag) {
            System.out.println(i);
        }
    }
}

我不需要任何替代方法,我只想知道代码中发生了什么,为什么它只给出2和3?

3 个答案:

答案 0 :(得分:1)

说明

一旦您遇到第一个非质数,就将标志设置为false,但您却忘记了重置以进行下一次运行

>

因此,在点击 4 (不是质数)后,它是false,并且保持为假


解决方案

您可以通过在外部循环的开头添加flag = true;来解决此问题。由于仅在循环内部需要该标志,因此您也可以直接在其中定义它:

public static void main(String[] args) {
    for (int i = 2; i <= 100; i++) {
        boolean flag = true; // "Resetting" the flag here
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                flag = false;
                break;
            }
        }

        if (flag) {
            System.out.println(i);
        }
    }
}

注释

变量名flag是一个很糟糕的名字,isPrime呢。那会很习惯。

如果将支票移至专用方法,也可能会提高可读性:

public static boolean isPrime(int number) {
    for (int j = 2; j < number; j++) {
        if (number % j == 0) {
            return false;
        }
    }
    return true;
}

然后像这样使用它:

for (int i = 2; i <= 100; i++) {
    if (isPrime(i)) {
        System.out.println(i);
    }
}

答案 1 :(得分:0)

您需要将flag重设为true。 试试这个:

                if (i % j == 0) {
                    flag = false;
                    break;
                } else {
                    flag = true;
                }

这使我的输出达到近100。

答案 2 :(得分:-1)

您只需要在内部循环之后将标志设置为true。否则,if(flag)的条件将在该标志首次设置为false时不通过。如果该标志设置为false,则它将退出循环,否则将被设置为true。

public static void main(String[] args) {
    for (int i = 2; i <= 100; i++) {
        boolean flag=true; // <---- Here
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                flag = false;
                break;
            }
        }

        if (flag) {
            System.out.println(i);
        }
    }
}