【问题标题】:Bug in prime number computation素数计算中的错误
【发布时间】:2019-11-11 21:08:42
【问题描述】:

我正在尝试打印 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?

【问题讨论】:

  • 你应该在内部循环之前将flag重置回true
  • 一旦达到 4,flag 就被设置为 false,而你再也不会将其设置为 true
  • 最好在第一个循环中定义flag
  • @Zabuza:数字的代码格式?真的吗?拥有 12k 声誉,您应该知道得更多。

标签: java primes


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

    您需要将flag 重置回true。 试试这个:

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

    这使我的输出达到了将近 100。

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2018-05-09
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      相关资源
      最近更新 更多