2012-12-22 6 views
-1

내가 쓴 것과 관련된 문제를 찾을 수 없습니다. 저는 Project Euler # 16에서 2^1000의 모든 숫자를 합산해야합니다. 내 프로그램은 작은 숫자와 함께 작동하지만 숫자가 약 18 자리 정도가되면 깨집니다. 어떤 도움이 필요합니까?답변에 알 수없는 요소가

public static double digit(double n){ 

    return n % 10; 

} 

public static double sumofDigits(double n){ 

    double sum = 0; 

    while(n > 1){ 

     sum += digit(n); 
     n = Math.floor(n/10); 

    } 

    return sum; 

} 

public static void main(String[] args) { 

    double x = Math.pow(2,1000); 

    double y = 22222222222222222222d; 

    System.out.println(sumofDigits(x)); 

      System.out.println(sumofDigits(y)); 

} 

}

+3

"깨지다"는 것은 무엇을 의미합니까? 오류가 있습니까? 이게 뭐야? – Ben

답변

5

두 배의 정확도는 십진수로 약 16 자입니다. 2 전원 1000보다 훨씬 많은 자릿수 (약 300)가 있기 때문에 당신은 단순히 두 배로 일할 수 없습니다.

BigInteger 클래스를 살펴보십시오.

1

현재 double을 사용할 수 없습니다 : 그들은 제한된 정밀도를 가지고있다. (Java primitive datatypes 참조)

그래서 Math.pow(2,1000)은 일부 (첫 번째) 자릿수와 지수 만 계산합니다.

임의의 긴 정수를 처리하는 라이브러리를 사용해야합니다. (예 : biginteger)

0

지금 받으 셨습니다. 여기서 모든 double을 10 진수를 나타내는 BigDecimal 객체로 바꿔 소수 정확도 & & #을 얻습니다. 모두에게 감사드립니다.

관련 문제