자바의 큰 숫자


93

Java에서 매우 많은 수의 계산을 수행하려면 어떻게해야합니까?

나는 시도 long했지만 최대 9223372036854775807이며 정수를 사용할 때 충분한 자릿수를 저장하지 않으므로 필요한만큼 정확하지 않습니다.

어쨌든 주위에 있습니까?


3
9223372036854775807Long.MAX_VALUE어쨌든 의 정확한 값입니다 .
진 권

답변:


153

BigInteger정수 및 BigDecimal소수 자릿수에 대해 클래스를 사용할 수 있습니다 . 두 클래스 모두 java.math패키지 에 정의되어 있습니다.

예:

BigInteger reallyBig = new BigInteger("1234567890123456890");
BigInteger notSoBig = new BigInteger("2743561234");
reallyBig = reallyBig.add(notSoBig);

8
계산을 할 계획이라면 BigInteger 클래스를 사용하여 발생하는 성능 저하를 상속 받는다는 것을 언급 할 가치가있을 것입니다.
haylem 2012

@haylem 성능 속도는 동일하지만 숫자의 길이로 인해 시간이 걸립니다. 비트 연산자를 사용하여 계산을 수행합니다. 원시 유형으로 수학을 할 때 일반적으로 발생하는 것과 같습니다.
ZOLDIK


18

다음은 큰 숫자를 매우 빠르게 얻는 예입니다.

import java.math.BigInteger;

/*
250000th fib # is: 36356117010939561826426 .... 10243516470957309231046875
Time to compute: 3.5 seconds.
1000000th fib # is: 1953282128707757731632 .... 93411568996526838242546875
Time to compute: 58.1 seconds.
*/
public class Main {
    public static void main(String... args) {
        int place = args.length > 0 ? Integer.parseInt(args[0]) : 250 * 1000;
        long start = System.nanoTime();
        BigInteger fibNumber = fib(place);
        long time = System.nanoTime() - start;

        System.out.println(place + "th fib # is: " + fibNumber);
        System.out.printf("Time to compute: %5.1f seconds.%n", time / 1.0e9);
    }

    private static BigInteger fib(int place) {
        BigInteger a = new BigInteger("0");
        BigInteger b = new BigInteger("1");
        while (place-- > 1) {
            BigInteger t = b;
            b = a.add(b);
            a = t;
        }
        return b;
    }
}

1
정말 큰 피보나치 수의 경우 재귀 계산은 엄청나게 시간이 많이 걸립니다. Binet의 명시 적 공식 을 사용하는 것이 훨씬 좋습니다 . Math.pow () 및 Math.sqrt () 몇 개는 나중에 완료되었습니다! :)
Zubin Mukerjee 16.10.06

1
@ZubinMukerjee 그러나 BigDecimal의 pow 및 sqrt도 저렴하지 않습니다. 반복보다는 낫지 만 소리만큼 간단하지는 않습니다.
Peter Lawrey 16.10.06


6
import java.math.BigInteger;
import java.util.*;
class A
{
    public static void main(String args[])
    {
        Scanner in=new Scanner(System.in);
        System.out.print("Enter The First Number= ");
        String a=in.next();
        System.out.print("Enter The Second Number= ");
        String b=in.next();

        BigInteger obj=new BigInteger(a);
        BigInteger obj1=new BigInteger(b);
        System.out.println("Sum="+obj.add(obj1));
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.