600851475143的“整数数太大”错误消息


89
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();
    }
}

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


1
“ l”和“ L”之间也没有区别吗?
user446654'9

@ user446654:不,有。后者更具可读性。阅读“ Java Puzzler”。
Adeel Ansari 2010年

@ user446654:不断发展的@Thilo关于可能的内存限制超出的想法,我想添加2个硬币:如果您想使用示例中的大数进行运算,则您选择了一种非常糟糕的算法来搜索数字的所有除数。基于动态编程的东西可能会更好。谷歌对此表示进一步的结果。
罗马2010年

1
添加了PE标签,Euler项目#3
2010年

@ st0le:恕我直言,问题绝对不是关于原始问题的解决方案,我们看到的也不是解决方案。
罗马2010年

Answers:


199

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


71

附加后缀L23423429L

默认情况下,java将所有数字文字解释为32位整数值。如果要明确指定此值大于32位整数,则应将后缀L用于长值。


对于那些寻求更彻底解释为什么即使将变量类型更改为后仍会收到此错误消息的人long,请阅读以下内容:stackoverflow.com/a/8924925/293280
Joshua Pinter

29

您需要使用长文字:

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

但我希望该功能用完内存(或时间)...


17
最好使用l大写字母,以便与1
Bozho 2010年

2
@Bozho:同意。但是我有Perl背景。我编码“只写” :-)
Thilo

使用“ L”代替“ l”
Kevin V

13

Java编译器默认将600851475143解释为int类型的常量。由于600851475143无法用int表示,因此会导致错误。

要告诉编译器您希望数字解释器很长,您必须添加一个lL之后。您的电话号码应如下所示600851475143L

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



4

在编译时,数字“ 600851475143”以32位整数表示,请改用长文字代替数字的末尾,以解决此问题。


3

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

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

例如 :

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

1

或者,您可以声明输入数字很长,然后让它执行代码tango: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;
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.