Große Zahlen in Java


93

Wie würde ich in Java mit extrem großen Zahlen rechnen?

Ich habe es versucht, longaber das ist maximal bei 9223372036854775807, und wenn eine Ganzzahl verwendet wird, werden nicht genügend Ziffern gespeichert und daher ist sie nicht genau genug für das, was ich brauche.

Gibt es sowieso um das herum?


3
9223372036854775807ist Long.MAX_VALUEsowieso der genaue Wert von .
Jin Kwon

Antworten:


153

Sie können die BigIntegerKlasse für Ganzzahlen und BigDecimalfür Zahlen mit Dezimalstellen verwenden. Beide Klassen sind im java.mathPaket definiert .

Beispiel:

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

8
Erwähnenswert ist möglicherweise der (wenn auch für die meisten offensichtliche, ererbte) ererbte Leistungseinbruch, der durch die Verwendung der BigInteger-Klasse entsteht, wenn Sie damit rechnen möchten.
Haylem

@ Haylem die Leistungsgeschwindigkeit ist die gleiche, aber die Länge der Zahl macht es Zeit. Sie verwenden bitweise Operatoren, um die Berechnungen durchzuführen. wie das, was normalerweise passiert, wenn man mit primitiven Typen rechnet.
ZOLDIK


18

Hier ist ein Beispiel, das sehr schnell große Zahlen erhält.

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
Für wirklich große Fibonacci-Zahlen ist die rekursive Berechnung lächerlich zeitaufwändig. Es ist viel besser, die explizite Formel von Binet zu verwenden . Ein paar Math.pow () s und Math.sqrt () s später sind Sie fertig! :)
Zubin Mukerjee

1
@ZubinMukerjee aber pow und sqrt auf BigDecimal sind auch nicht billig. Es ist besser als Iteration, aber nicht so einfach, wie es sich anhört.
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));
    }
}

3

Je nachdem, was Sie tun, möchten Sie vielleicht einen Blick auf GMP (gmplib.org) werfen, eine leistungsstarke Bibliothek mit mehreren Genauigkeiten. Um es in Java zu verwenden, benötigen Sie JNI-Wrapper um die Binärbibliothek.

In einem Teil des Alioth Shootout-Codes finden Sie ein Beispiel für die Verwendung anstelle von BigInteger, um Pi auf eine beliebige Anzahl von Stellen zu berechnen.

https://benchmarksgame-team.pages.debian.net/benchmarksgame/program/pidigits-java-2.html

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.