gentoo linux, java, software libre y otras hierbas
Abr, 16 2009 - 2:14 pm

La clase BigInteger en Java

BigInteger y BigDecimal son clases envoltura de los tipos primitivos int y double, sin embargo tienen ventajas sobre los tipos primitivos. Cuando necesites usar números grandes en Java la mejor opción es usar estas clases, ya que su limite de almacenamiento es el límite de memoria que tenga la máquina virtual de Java.

Además, estas clases proporcionan algunos métodos bastante interesantes, como las operaciones básicas o saber si el número es primo o no. Como siempre vamos con algunos ejemplos de apoyo:

Operaciones básicas con la clase BigInteger

En el siguiente ejemplo se hace uso de los métodos add, substract, multiply y divide para realizar las operaciones básicas de suma, resta, multiplicación y división:

import java.math.BigInteger;
public class PruebaOperacionesBasicas {
    public static void main(String args[]){
        BigInteger entero1 = BigInteger.valueOf(45);
        BigInteger entero2 = BigInteger.valueOf(15);
        //sumar con metodo add()
        String texto = "La suma entre "+entero1+
                " y "+entero2+" es "+entero1.add(entero2);
        //restar con metodo substract()
        texto += "\nLa resta entre "+entero1+
                " y "+entero2+" es "+entero1.subtract(entero2);
        //multiplicar con metodo multiply()
        texto += "\nEl producto de "+entero1+
                " y "+entero2+" es "+entero1.multiply(entero2);
        //dividir con metodo divide()
        texto += "\nLa división de "+entero1+
                " y "+entero2+" entre "+entero1.divide(entero2);
        System.out.println(texto);
    }
}

Números primos en Java

Este es un típico ejercicio que nos plantean en la universidad; se trata de hacer un listado de los primeros X números primos. En este caso BigInteger nos proporciona dos métodos muy interesantes: isProbablePrime y nextProbablePrime. El primero de ellos devuelve true si el número es probablemente primo (recordemos que es complejo saber si un número es o no primo cuando es demasiado grande); el segundo devuelve el próximo posible número primo a partir del valor que contenga el objeto.

La siguiente aplicación usa el método nextProbablePrime para listar los primeros 2000 números primos:

import java.math.BigInteger;
public class PruebaNumerosPrimos {
    public static void main(String args[]){
        //iniciar el entero en cero
        BigInteger entero = BigInteger.ZERO;
        StringBuffer texto = new StringBuffer();
        for(int i = 0; i<2000; i++){
            entero = entero.nextProbablePrime();
            texto.append(entero+"\n");
            entero.add(BigInteger.ONE);
        }
        System.out.println(texto);
    }
}

Otros métodos interesantes

La clase BigInteger proporciona además otros métodos que nos ahorrarán bastante tiempo y líneas de código:

  • pow, nos permite elevar un número a la potencia que deseemos.
  • comparteTo, nos permite comparar si un BigInteger es mayor, igual o menor que otro.
  • min y max, nos permiten saber cuál de los dos BigInteger es menor o mayor.

Como mencioné al principio, también es posible usar la clase BigDecimal que funciona de manera similar pero con números de coma flotante.

Descargar código fuente de ejemplos

11 Comentarios | deja el tuyo

2 enlaces entrantes

9 Comentarios en “La clase BigInteger en Java”

  1. Juan Manuel dice:

    hola que tal muy interesante tu explicación, un pregunta no existe una funcion tipo clock de c, c++; pero para java

    Gracias, ya pinche el banner

  2. phicar dice:

    Sinceramente esa clase desde que la conosco(principios de éste año) me ha hecho la vida mucho más colorida en java :P vemos

  3. jorge dice:

    hola queria saber como se lee de un archivo de texto a una variable BigInteger

  4. phicar dice:

    import java.io.*;
    import java.math.BigInteger;
    public class nose{
    public static void main(String args[]) throws IOException{
    byte tales[] = new byte[new File("ar").length()];
    FileInputStream flin = new FileInputStream(“ar”);
    flin.read(tales);
    BigInteger epa = new BigInteger(new String(tales,0,tales.length-1));
    System.out.println(epa);
    }
    }

    Eso si lees el archivo, donde ar solo contendra el numero y ningun otro caracter…

    puedes tambien usar un Buffer para hacerlo por lineas…o pues infinidad de formas ahi si imaginacion ;)

  5. Johann dice:

    Esta información es de gran ayuda. Gracias.

  6. fermin dice:

    Hola
    Excelente clase¡¡

    Saludos

  7. ROLANDO dice:

    HOLA QUE TAL INTERESANTE, PERO EL EJEMPLO NO SERIA EFICIENTE PAR NUMEROS MUY GRANDES COMO NUMEROS CON MAS DE 100 DIGITOS , YO SUGERERIA QUE PUSIERAN UN EJEMPLO ASI ,SE LES AGRESERIA MUCHO ,….. GRACIAS

¡Déjanos tu comentario!