【问题标题】:Statements outside for loop are not being executedfor 循环外的语句没有被执行
【发布时间】:2014-02-07 19:55:59
【问题描述】:

我是 Java 新手。我找到了一个名为 project eulder 的网站,正在练习一个问题。 我不明白为什么以下程序不显示任何内容,但当我输入 System.out.println(max);进入 for 循环它可以工作,但显示所有素数,包括最大的。我只给谁显示最大的素数?

public class LargestPrimeFactor {

    public static void main(String[] args) {
        long x = 600851475143L;
        int max = 0;
        for (int i = 1; i <= x; i++) {
            if (x % i == 0)
                if (isPrime(i))
                    max = i;
        }
        System.out.println(max);

    }

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

【问题讨论】:

  • 你应该学会使用调试器。如果做不到这一点,你应该写出你的算法所采取的每一步。
  • 它被称为LargestPrimeFactor,而不是AllThePrimeFactors
  • 你将溢出循环中的 int。
  • 你知道,如果你从顶部开始往下走,你会发现最大,而不必先检查它下面的所有万亿个数字。
  • 从逻辑上讲,您的代码是正确的(在 isPrime(i) 之后放置一个 System.out.println - 请添加更多大括号 - 您会看到您的代码正常工作)。您只是没有给它足够的时间来处理 600851475143 值。这意味着您可能需要重新考虑您的方法。

标签: java loops for-loop unreachable-code


【解决方案1】:

您编写了一个无限循环:600851475143L 大于可存储在 int 中的最大值,因此 i &lt;= x 将始终为 true

i 和所有其他相关变量更改为long 可能会解决此问题,但您仍然需要重新考虑您的算法。检查 600851475143 个数字是否为素数只会花费太长时间。

提示:一旦你找到一个能除以x 的数字,你就可以用这个数字除以x...(希望这不会破坏乐趣)

【讨论】:

  • int 的数字太大时,你如何 for 循环?不是他应该,我只是想知道。
  • 简单:for (long l=0; l &lt; max; l++) ... for 循环语法中的任何内容都不会强制您使用 int 或偶数。
  • 谢谢!将所有变量更改为 long 并没有解决问题,因为找到数字需要花费太多时间,但将 x 除以其除数直接给了我答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多