Duże liczby w Javie


95

Jak bym się zabrał do wykonywania obliczeń na bardzo dużych liczbach w Javie?

Próbowałem, longale to osiąga maksimum na 9223372036854775807, a przy użyciu liczby całkowitej nie zapisuje wystarczającej liczby cyfr i dlatego nie jest wystarczająco dokładny dla tego, czego potrzebuję.

Czy jest w tym jakiś sposób?


3
9223372036854775807to dokładna wartość Long.MAX_VALUE.
— Jin Kwon

Odpowiedzi:


154

Możesz użyć tej BigIntegerklasy dla liczb całkowitych i BigDecimaldla liczb z cyframi dziesiętnymi. Obie klasy są zdefiniowane w java.mathpakiecie.

Przykład:

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

8
Warto wspomnieć o (choć wydaje mi się, że dla większości oczywistych) spadkiem wydajności wynikającym z użycia klasy BigInteger, jeśli planujesz wykonywać z tym obliczenia.
— haylem

@haylem szybkość działania jest taka sama, ale długość numeru sprawia, że ​​wymaga to czasu. używają operatorów bitowych do wykonywania obliczeń. jak to, co dzieje się normalnie podczas wykonywania matematyki na typach prymitywnych.
— Eboubaker


18

Oto przykład, który bardzo szybko daje duże liczby.

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
W przypadku naprawdę dużych liczb Fibonacciego rekurencyjne obliczenia są absurdalnie czasochłonne. O wiele lepiej jest użyć wyraźnej formuły Bineta . Kilka Math.pow () si Math.sqrt () później, gotowe! :)
— Zubin Mukerjee

2
@ZubinMukerjee jednak pow i sqrt na BigDecimal też nie są tanie. Jest lepsze niż iteracja, ale nie jest tak proste, jak się wydaje.
— Peter Lawrey


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.