Grandi numeri in Java


93

Come dovrei fare calcoli con numeri estremamente grandi in Java?

Ho provato longma questo arriva al massimo a 9223372036854775807, e quando si utilizza un numero intero non salva abbastanza cifre e quindi non è abbastanza preciso per quello che mi serve.

C'è un modo per aggirare questo?


3
9223372036854775807è comunque il valore esatto di Long.MAX_VALUE.
Jin Kwon

Risposte:


153

Puoi usare la BigIntegerclasse per gli interi e BigDecimalper i numeri con cifre decimali. Entrambe le classi sono definite nel java.mathpacchetto.

Esempio:

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

8
Potrebbe valere la pena menzionare il (sebbene ovvio per la maggior parte, immagino) il calo delle prestazioni dell'ereditarietà causato dall'uso della classe BigInteger se si prevede di eseguire calcoli con quello.
haylem

@haylem la velocità di esecuzione è la stessa ma la lunghezza del numero richiede tempo. usano operatori bit per bit per eseguire i calcoli. come quello che accade normalmente quando si fa matematica con i tipi primitivi.
ZOLDIK


18

Ecco un esempio che ottiene grandi numeri molto rapidamente.

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
Per numeri di Fibonacci molto grandi, il calcolo ricorsivo richiede molto tempo. Molto meglio usare la formula esplicita di Binet . Alcuni Math.pow () se Math.sqrt () dopo, hai finito! :)
Zubin Mukerjee

1
@ZubinMukerjee tuttavia pow e sqrt su BigDecimal non sono economici. È meglio dell'iterazione ma non così semplice come sembra.
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));
    }
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.