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);
上产生错误。为什么呢?
答案 0 :(得分:168)
600851475143
不能表示为32位整数(类型int
)。它可以表示为64位整数(类型long
)。 Java中的长文字以“L”结尾:600851475143L
答案 1 :(得分:57)
附加后缀L
:23423429L
。
默认情况下,java将所有数字文字解释为32位整数值。如果你想明确指出这比32位整数更大,你应该使用后缀L
作为长值。
答案 2 :(得分:24)
您需要使用长文字:
obj.function(600851475143l); // note the "l" at the end
但我希望这个功能耗尽内存(或时间)......
答案 3 :(得分:11)
java编译器默认尝试将600851475143解释为int类型的常量值。这会导致错误,因为600851475143无法用int表示。
要告诉编译器您希望数字解释为long,您必须在其后面添加l
或L
。您的号码应该如下600851475143L
。
由于某些字体难以区分“1”和小写“l”,因此您应始终使用大写字母“L”。
答案 4 :(得分:5)
您需要40位来表示整数字面值600851475143.在Java中,最大整数值为2 ^ 31-1(即整数为32位,请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html)。
这与function
无关。请尝试使用长整数文字(如其他答案中所述)。
答案 5 :(得分:3)
在编译时,数字“600851475143”以32位整数表示,尝试使用长文字而不是数字的末尾来解决此问题。
答案 6 :(得分:1)
除了所有其他答案,您可以做的是:
long l = Long.parseLong("600851475143");
例如:
obj.function(Long.parseLong("600851475143"));
答案 7 :(得分:0)
或者,您可以将输入数字声明为long,然后让它执行代码探戈: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;
}
}
}