【问题标题】:"Integer number too large" error message for 600851475143600851475143 的“整数太大”错误消息
【发布时间】:2011-04-15 00:56:39
【问题描述】:
public class Three {
    public static void main(String[] args) {
        Three obj = new Three();
        obj.function(600851475143);
    }

    private Long function(long  i) {
        Stack<Long> stack = new Stack<Long>();

        for (long j = 2; j <= i; j++) {
            if (i % j == 0) {
                stack.push(j);
            }
        }
        return stack.pop();
    }
}

当上面的代码运行时,它会在obj.function(600851475143); 行产生一个错误。为什么?

【问题讨论】:

  • “l”和“L”也没有区别吗?
  • @user446654:不,有。后者更具可读性。请阅读“Java Puzzler”。
  • @user446654:不断发展@Thilo 对可能超出内存限制的想法我想添加我的 2 个硬币:如果你想操作,你选择了非常非常糟糕的算法来搜索数字的所有除法器像您的示例中那样大的数字。基于动态编程的东西可能会更好。谷歌上的进一步结果。
  • 添加了 PE 标签,Project Euler #3
  • @st0le:恕我直言,这个问题绝对不是关于原始问题的解决方案,我们看到的也不是解决方案。

标签: java integer


【解决方案1】:

600851475143 不能表示为 32 位整数(类型 int)。它可以表示为 64 位整数(类型 long)。 Java 中的长文字以“L”结尾:600851475143L

【讨论】:

    【解决方案2】:

    附加后缀L:23423429L

    默认情况下,java 将所有数字文字解释为 32 位整数值。如果您想明确指定这是大于 32 位整数的值,您应该使用后缀 L 表示 long 值。

    【讨论】:

    • 对于那些希望更全面地解释为什么即使在将变量类型更改为 long 后仍会收到此错误消息的人,请阅读以下内容:stackoverflow.com/a/8924925/293280
    【解决方案3】:

    你需要使用长文本:

    obj.function(600851475143l);  // note the "l" at the end
    

    但我希望该函数会耗尽内存(或时间)...

    【讨论】:

    • l 大写被认为是一种更好的做法,以便与1 轻松区分
    • @Bozho:同意。但我有 Perl 背景。我编码“只写”:-)
    • 用“L”代替“l”
    【解决方案4】:

    默认情况下,java 编译器尝试将 600851475143 解释为 int 类型的常量值。这会导致错误,因为 600851475143 不能用 int 表示。

    要告诉编译器您希望将数字解释为 long,您必须在其后添加 lL。然后您的号码应如下所示600851475143L

    由于某些字体很难区分“1”和小写“l”,因此您应该始终使用大写“L”。

    【讨论】:

      【解决方案5】:

      您需要 40 位来表示整数文字 600851475143。然而,在 Java 中,最大整数值为 2^31-1(即整数是 32 位,请参阅 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html)。

      这与function 无关。尝试改用长整数文字(如其他答案中所建议)。

      【讨论】:

        【解决方案6】:

        在编译时,数字“600851475143”以 32 位整数表示,请尝试在数字末尾使用长文本来解决此问题。

        【讨论】:

          【解决方案7】:

          除了所有其他答案,你可以做的是:

          long l = Long.parseLong("600851475143");
          

          例如:

          obj.function(Long.parseLong("600851475143"));
          

          【讨论】:

          • 是的,技术上可行。不过加个 L 更方便。
          【解决方案8】:

          或者,您可以将输入的数字声明为只要,然后让它做代码探戈:D ...

          public static void main(String[] args) {
          
              Scanner in = new Scanner(System.in);
              System.out.println("Enter a number");
              long n = in.nextLong();
          
              for (long i = 2; i <= n; i++) {
                  while (n % i == 0) {
                      System.out.print(", " + i);
                      n /= i;
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-06
            • 1970-01-01
            • 1970-01-01
            • 2022-07-21
            • 2011-06-15
            • 2017-11-23
            • 1970-01-01
            相关资源
            最近更新 更多