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

위의 코드가 실행되면 줄에 오류가 발생합니다 obj.function(600851475143);. 왜?


1
"l"과 "L"사이에도 차이가 없나요?
user446654

@ user446654 : 아니요, 있습니다. 후자는 더 읽기 쉽습니다. 이에 대해서는 "Java Puzzler"를 읽어보십시오.
Adeel Ansari

@ user446654 : 진화하는 @Thilo는 가능한 메모리 제한을 초과하는 것으로 생각합니다. 2 개의 동전을 추가하고 싶습니다. 예와 같이 큰 숫자로 작업하려면 숫자의 모든 분할자를 검색하는 데 정말 나쁜 알고리즘을 선택했습니다. 동적 프로그래밍을 기반으로 하는 것이 아마도 더 잘 작동 할 것입니다. 추가 결과를 얻으려면 Google에 문의하십시오.
Roman

1
PE 태그 추가, Project Euler # 3
st0le

@ st0le : IMHO 질문은 확실히 원래의 문제 해결에 관한 것이 아니며 우리가 보는 것도 해결책이 아닙니다.
Roman

답변:


201

60085147514332 비트 정수 (유형 int) 로 표현할 수 없습니다 . 64 비트 정수 (유형 long) 로 나타낼 수 있습니다 . Java의 긴 리터럴은 "L"로 끝납니다.600851475143L


71

접미사 추가 L: 23423429L.

기본적으로 java는 모든 숫자 리터럴을 32 비트 정수 값으로 해석합니다. 32 비트 정수보다 더 큰 L값 을 명시 적으로 지정하려면 long 값에 접미사 를 사용해야 합니다.


변수 유형을으로 변경 한 long
Joshua Pinter

29

긴 리터럴을 사용해야합니다.

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

하지만 그 함수가 메모리 (또는 시간) 부족할 것으로 예상합니다.


17
할 수있는 더 좋은 연습 간주됩니다 l그것은에서 쉽게 구별 그래서, 대문자를1
Bozho

2
@Bozho : 동의합니다. 하지만 저는 Perl 배경이 있습니다. 나는 "쓰기 전용"코드 :-)
Thilo

"l"대신 "L"사용
Kevin V

13

Java 컴파일러는 600851475143을 기본적으로 int 유형의 상수 값으로 해석하려고합니다. 600851475143은 int로 표현할 수 없기 때문에 오류가 발생합니다.

긴 숫자 인터 프리트를 원한다는 것을 컴파일러에 알리려면 그 중 하나 l또는 L뒤에 추가해야 합니다. 그러면 번호가 다음과 같이 표시 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;
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.