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);
. 왜?
답변
600851475143
32 비트 정수 (유형 int
) 로 표현할 수 없습니다 . 64 비트 정수 (유형 long
) 로 나타낼 수 있습니다 . Java의 긴 리터럴은 “L”로 끝납니다.600851475143L
답변
접미사 추가 L
: 23423429L
.
기본적으로 java는 모든 숫자 리터럴을 32 비트 정수 값으로 해석합니다. 32 비트 정수보다 더 큰 L
값 을 명시 적으로 지정하려면 long 값에 접미사 를 사용해야 합니다.
답변
긴 리터럴을 사용해야합니다.
obj.function(600851475143l); // note the "l" at the end
하지만 그 함수가 메모리 (또는 시간) 부족할 것으로 예상합니다.
답변
Java 컴파일러는 600851475143을 기본적으로 int 유형의 상수 값으로 해석하려고합니다. 600851475143은 int로 표현할 수 없기 때문에 오류가 발생합니다.
긴 숫자 인터 프리트를 원한다는 것을 컴파일러에 알리려면 그 중 하나 l
또는 L
뒤에 추가해야 합니다. 그러면 번호가 다음과 같이 표시 600851475143L
됩니다.
일부 글꼴은 “1”과 소문자 “l”을 구분하기 어렵 기 때문에 항상 대문자 “L”을 사용해야합니다.
답변
정수 리터럴 600851475143을 나타내려면 40 비트가 필요합니다. Java에서 최대 정수 값은 2 ^ 31-1입니다 (즉, 정수는 32 비트입니다. http://download.oracle.com/javase/1.4.2/docs 참조). /api/java/lang/Integer.html ).
이것은 function
. 대신 긴 정수 리터럴을 사용해보십시오 (다른 답변에서 제안한대로).
답변
컴파일 시간에 숫자 “600851475143”은 32 비트 정수로 표시됩니다. 대신 숫자 끝에 긴 리터럴을 사용하여이 문제를 해결하십시오.
답변
다른 모든 답변과 별도로 할 수있는 작업은 다음과 같습니다.
long l = Long.parseLong("600851475143");
예 :
obj.function(Long.parseLong("600851475143"));