Wie konvertiere ich einen String in eine BigInteger?

82

Ich versuche, einige wirklich große Zahlen aus der Standardeingabe zu lesen und sie zu addieren.

Um BigInteger hinzuzufügen, muss ich jedoch Folgendes verwenden BigInteger.valueOf(long);:

private BigInteger sum = BigInteger.valueOf(0);

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    sum = sum.add(BigInteger.valueOf(Long.parseLong(newNumber)));
}

Das funktioniert gut, aber da das BigInteger.valueOf()einzige a ist long, kann ich keine Zahlen hinzufügen, die größer als longder Maximalwert sind (9223372036854775807).

Immer wenn ich versuche, 9223372036854775808 oder mehr hinzuzufügen, erhalte ich eine NumberFormatException (was vollständig erwartet wird).

Gibt es so etwas BigInteger.parseBigInteger(String)?

Twinone
quelle

Antworten:

140

Konstruktor verwenden

BigInteger (String val)

Übersetzt die dezimale Zeichenfolgendarstellung einer BigInteger in eine BigInteger.

Javadoc

Uku Loskit
quelle
Ich habe das gleiche versucht, aber ich hatte ein Problem, weil ich den Import von java.math.BigInteger
Arun
23

Laut Dokumentation :

BigInteger (String val)

Übersetzt die dezimale Zeichenfolgendarstellung einer BigInteger in eine BigInteger.

Dies bedeutet, dass Sie a verwenden können String, um ein BigIntegerObjekt zu initialisieren , wie im folgenden Snippet gezeigt:

sum = sum.add(new BigInteger(newNumber));
Vito Gentile
quelle
10

BigInteger verfügt über einen Konstruktor, in dem Sie einen String als Argument übergeben können.

versuchen Sie es unten,

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    this.sum = this.sum.add(new BigInteger(newNumber));
}
Darshit Chokshi
quelle
8

Anstatt valueOf(long)und zu verwenden parse(), können Sie direkt den BigInteger-Konstruktor verwenden, der ein Zeichenfolgenargument verwendet:

BigInteger numBig = new BigInteger("8599825996872482982482982252524684268426846846846846849848418418414141841841984219848941984218942894298421984286289228927948728929829");

Das sollte Ihnen den gewünschten Wert geben.

User9123
quelle
2

Für eine Schleife, in der Sie ein arrayvon stringsin ein arrayvon konvertieren möchten, gehen Sie wie folgt vor bigIntegers:

String[] unsorted = new String[n]; //array of Strings
BigInteger[] series = new BigInteger[n]; //array of BigIntegers

for(int i=0; i<n; i++){
    series[i] = new BigInteger(unsorted[i]); //convert String to bigInteger
}
Omar Mohammed
quelle
0

Wenn Sie Klartext (nicht nur Zahlen) in eine BigInteger konvertieren möchten, wird eine Ausnahme angezeigt, wenn Sie nur Folgendes versuchen: new BigInteger ("keine Zahl")

In diesem Fall könnten Sie es so machen:

public  BigInteger stringToBigInteger(String string){
    byte[] asciiCharacters = string.getBytes(StandardCharsets.US_ASCII);
    StringBuilder asciiString = new StringBuilder();
    for(byte asciiCharacter:asciiCharacters){
        asciiString.append(Byte.toString(asciiCharacter));
    }
    BigInteger bigInteger = new BigInteger(asciiString.toString());
    return bigInteger;
}
Aaron Fritzmaster
quelle