¿Cómo convierto un String en un BigInteger?


82

Estoy tratando de leer algunos números realmente grandes de la entrada estándar y sumarlos.

Sin embargo, para agregar a BigInteger, necesito usar 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)));
}

Eso funciona bien, pero como BigInteger.valueOf()solo se necesita una long, no puedo agregar números mayores que longel valor máximo (9223372036854775807).

Cada vez que intento agregar 9223372036854775808 o más, obtengo una NumberFormatException (que es completamente esperada).

¿Hay algo así BigInteger.parseBigInteger(String)?

Respuestas:


140

Usando el constructor

BigInteger (Cadena val)

Traduce la representación de cadena decimal de un BigInteger en un BigInteger.

Javadoc


Intenté lo mismo pero enfrenté el problema porque me perdí al importar java.math.BigInteger
Arun

23

Según la documentación :

BigInteger (Cadena val)

Traduce la representación de cadena decimal de un BigInteger en un BigInteger.

Significa que puede usar a Stringpara inicializar un BigIntegerobjeto, como se muestra en el siguiente fragmento:

sum = sum.add(new BigInteger(newNumber));

10

BigInteger tiene un constructor donde puede pasar una cadena como argumento.

prueba a continuación,

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

8

En lugar de usar valueOf(long)y parse(), puede usar directamente el constructor BigInteger que toma un argumento de cadena:

BigInteger numBig = new BigInteger("8599825996872482982482982252524684268426846846846846849848418418414141841841984219848941984218942894298421984286289228927948728929829");

Eso debería darte el valor deseado.


2

Para un bucle en el que desea convertir una arrayde stringsen una arrayde, bigIntegershaga esto:

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
}

0

Si desea convertir texto sin formato (no solo números) a un BigInteger, se encontrará con una excepción, si solo intenta: new BigInteger ("no un número")

En este caso, podría hacerlo así:

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.