Jak przekonwertować ciąg na BigInteger?

83

Próbuję odczytać naprawdę duże liczby ze standardowego wejścia i zsumować je.

Jednak aby dodać do BigInteger, muszę użyć 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)));
}

To działa dobrze, ale jako BigInteger.valueOf()jedyny zajmuje a long, nie mogę dodać liczb większych niż longwartość maksymalna (9223372036854775807).

Ilekroć próbuję dodać 9223372036854775808 lub więcej, otrzymuję NumberFormatException (co jest całkowicie oczekiwane).

Czy jest coś takiego BigInteger.parseBigInteger(String)?

Twinone
źródło

Odpowiedzi:

141

Korzystanie z konstruktora

BigInteger (wartość ciągu)

Tłumaczy dziesiętną reprezentację String BigInteger na BigInteger.

Javadoc

Uku Loskit
źródło
Próbowałem tego samego, ale napotkałem problem, ponieważ nie udało mi się zaimportować java.math.BigInteger
Arun
23

Zgodnie z dokumentacją :

BigInteger (wartość ciągu)

Tłumaczy dziesiętną reprezentację String BigInteger na BigInteger.

Oznacza to, że możesz użyć a Stringdo zainicjowania BigIntegerobiektu, jak pokazano w poniższym fragmencie:

sum = sum.add(new BigInteger(newNumber));
Vito Gentile
źródło
10

BigInteger ma konstruktor, w którym można przekazać ciąg jako argument.

spróbuj poniżej,

private void sum(String newNumber) {
    // BigInteger is immutable, reassign the variable:
    this.sum = this.sum.add(new BigInteger(newNumber));
}
Darshit Chokshi
źródło
8

Zamiast używać valueOf(long)i parse(), możesz bezpośrednio użyć konstruktora BigInteger, który przyjmuje argument typu string:

BigInteger numBig = new BigInteger("8599825996872482982482982252524684268426846846846846849848418418414141841841984219848941984218942894298421984286289228927948728929829");

To powinno dać ci pożądaną wartość.

Użytkownik9123
źródło
2

W przypadku pętli, w której chcesz przekonwertować arrayof stringsna arrayof, bigIntegerswykonaj następujące czynności:

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
źródło
0

Jeśli chcesz przekonwertować zwykły tekst (nie tylko liczby) na BigInteger, napotkasz wyjątek, jeśli po prostu spróbujesz: nowy BigInteger („not a Number”)

W takim przypadku możesz to zrobić w ten sposób:

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
źródło