¿Cómo convierto una cadena en un BigInteger?

2 minutos de lectura

avatar de usuario
gemelo

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 el BigInteger.valueOf() solo toma un longno puedo sumar números mayores que longvalor máximo de (9223372036854775807).

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

¿Hay algo como BigInteger.parseBigInteger(String)?

avatar de usuario
Uku Loskit

Usando el constructor

BigInteger(Valor de cadena)

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

Javadoc

  • Intenté lo mismo pero enfrenté un problema porque no pude importar java.math.BigInteger

    – Arun

    19 de agosto de 2018 a las 13:50

  • ok, de entero: valueOf, de String, constructor, ¿esta API pierde algo de coherencia?

    – pdem

    26 de agosto de 2021 a las 13:58

avatar de usuario
vito gentil

De acuerdo con la documentación:

BigInteger(Valor de cadena)

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

Significa que puedes usar un String para inicializar un BigInteger objeto, como se muestra en el siguiente fragmento:

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

avatar de usuario
Darshit Chokshi

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));
}

avatar de usuario
Usuario9123

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.

avatar de usuario
Omar Mohamed

Para un bucle en el que desea convertir un array de strings a una array de bigIntegers hacer 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
}

avatar de usuario
Bhargav Rao

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

En este caso podrías 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;
}

¿Ha sido útil esta solución?