[java] 600851475143에 대한 “정수 번호가 너무 큽니다”오류 메시지

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);. 왜?



답변

60085147514332 비트 정수 (유형 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"));