sábado, 28 de junio de 2014

Números Grandes en Java

Manejo básico de BigInteger.

En el API de Java,  paquete java.math se encuentra la clase BigInteger.
import java.math.BigInteger;

La clase BigInteger nos permite procesar números con N cantidad de dígitos, donde N es un número considerablemente alto.

*BigInteger solo permite valores del tipo entero.
**Para números decimales con una cantidad grande de dígitos se utiliza BigDecimal.*Se explicara en otra entrada al blog.

Importancia del Biginteger.

La importancia de BigInteger radica en la cantidad de dígitos en un número, teniendo en cuenta que:

Nombre        Rango Aproximado

byte              -128 a 127
short             -32768 a 32767
int                  -2147483648 a 2147483647
long               -9223372036854775808 a 9223372036854775807

Donde la mayor cantidad de dígitos que se puede tener en números enteros es en el uso de un long con la cantidad de 19 dígitos.

Uso del Biginteger.

Para hacer uso de un BigInteger se crea de las siguientes maneras:

·         Forma 1:

Uso de las variables estáticas en BigInteger, la clase tiene 3 variables estáticas que nos facilitan la inicialización del objeto.

Crea el BigInteger con valor de inicio:

1   [ uno ] - BigInteger.ONE
10 [ diez ] - BigInteger.TEN;
0   [ cero ] - BigInteger.ZERO;

BigInteger forma1 = BigInteger.ZERO;

·         Forma 2:

En la creación del objeto BigInteger se manda como parámetro el número como cadena de caracteres o datos de tipo numérico convertido a String, o simplemente leer desde teclado usando Scanner.

Parámetro pasado como cadena:
String numero = “123456789101112”;
BigInteger forma2 = new BigInteger(numero);

Parámetro pasado como long:
long num = 9223372036854775807L;
BigInteger forma2 = new BigInteger(num+"");

Parámetro leído desde teclado usando Scanner:
            Scanner s = new Scanner (System.in);
            BigInteger num = s.nextBigInteger();

Operaciones básicas con BigInter:

Suma – add() –

        Se usa el método .add() para sumar 2  números del tipo BigInteger.

        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");
       
        BigInteger resultado = uno.add(dos);
        System.out.println("Resultado de suma de 2 objetos BigInteger : "+resultado);

Resta – subtract() –

        Se usa el método .subtract() para restar 2  números del tipo BigInteger.

        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.subtract(dos);
        System.out.println("Resultado de resta de 2 objetos BigInteger : " + resultado);

Multiplicación – multiply () –

        Se usa el método .multiply () para multiplicar 2  números del tipo BigInteger.

        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.multiply(dos);
   System.out.println("Resultado de multiplicación de 2 objetos BigInteger : " + resultado);

División – divide () –

        Se usa el método .divide () para dividir 2  números del tipo BigInteger.

        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.divide(dos);
       System.out.println("Resultado de división de 2 objetos BigInteger : " + resultado);

Residuo Modulo – mod () –

        Se usa el método .mod() para obtener el residuo de 2  números del tipo BigInteger.

        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("4");

        BigInteger resultado = uno.mod(dos);
       System.out.println("Resultado del residuo de 2 objetos BigInteger : " + resultado);

Operaciones de Bits  .xor() - and() - or() –

        Se usan los métodos .xor() - and() - or()  del objeto BigInteger para operaciones de bits.

        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.xor(dos);
        System.out.println("Resultado del xor de 2 objetos BigInteger : " + resultado);
       
        resultado = uno.or(dos);
        System.out.println("Resultado del or de 2 objetos BigInteger : " + resultado);
       
        resultado = uno.and(dos);
        System.out.println("Resultado del and de 2 objetos BigInteger : " + resultado);

Código Completo:

import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        crearBigIntegerMetodo1();
        crearBigIntegerMetodo2();
        operacionSuma();
        operacionResta();
        operacionMultiplicacion();
        operacionDivision();
        operacionResiduo();
        operacionesDeBits();
    }

    public static void crearBigIntegerMetodo1() {
        // Formas de instanciar un BigInteger :
        // Forma 1:
        BigInteger num1 = BigInteger.ONE;
        BigInteger num2 = BigInteger.TEN;
        BigInteger num3 = BigInteger.ZERO;

        System.out.println("Valor de num1 : " + num1);
        System.out.println("Valor de num2 : " + num2);
        System.out.println("Valor de num3 : " + num3);
    }

    public static void crearBigIntegerMetodo2() {
        // Formas de instanciar un BigInteger :
        // Forma 2:        
        Scanner s = new Scanner(System.in);

        String numero = "9223372036854775807000000";
        BigInteger porString = new BigInteger(numero);
        System.out.println("BigInteger creado por cadena String : " + porString);

        long Long = 9223372036854775807L;
        BigInteger porLong = new BigInteger(Long + "");
        System.out.println("BigInteger creado por long : " + porLong);

        System.out.println("Ingrese un número BigInteger : ");
        BigInteger leidoPorTeclado = s.nextBigInteger();
        System.out.println("El BigInteger leído por teclado es : " + leidoPorTeclado);
    }

    public static void operacionSuma() {
        // Se usa el método .add() del objeto BigInteger.
        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.add(dos);
        System.out.println("Resultado de suma de 2 objetos BigInteger : " + resultado);
    }

    public static void operacionResta() {
        // Se usa el método .subtract() del objeto BigInteger.
        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.subtract(dos);
        System.out.println("Resultado de resta de 2 objetos BigInteger : " + resultado);

    }

    public static void operacionMultiplicacion() {
        // Se usa el método .multiply() del objeto BigInteger.
        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.multiply(dos);
        System.out.println("Resultado de multiplicación de 2 objetos BigInteger : " + resultado);

    }

    public static void operacionDivision() {
        // Se usa el método .divide() del objeto BigInteger.
        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.divide(dos);
        System.out.println("Resultado de división de 2 objetos BigInteger : " + resultado);
    }

    public static void operacionResiduo() {
        // Se usa el método .divide() del objeto BigInteger.
        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("4");

        BigInteger resultado = uno.mod(dos);
        System.out.println("Resultado del residuo de 2 objetos BigInteger : " + resultado);
    }

    public static void operacionesDeBits() {
        // Se usa el método .xor() - and() - or() del objeto BigInteger.
        BigInteger uno = new BigInteger("9223372036854775807");
        BigInteger dos = new BigInteger("9223372036854775807");

        BigInteger resultado = uno.xor(dos);
        System.out.println("Resultado del xor de 2 objetos BigInteger : " + resultado);
        
        resultado = uno.or(dos);
        System.out.println("Resultado del or de 2 objetos BigInteger : " + resultado);
        
        resultado = uno.and(dos); 
        System.out.println("Resultado del and de 2 objetos BigInteger : " + resultado);
    }
}

Con esto concluye el tema de manejo básico de clase BigInteger, demostrando que es una gran ayuda para realizar operaciones con números con dígitos muy grandes.

Cualquier duda- comentario – sugerencia estoy a sus órdenes. 

9 comentarios:

  1. Excelente, pero falta con lo de <= >= entre grandes enteros, etc, necesito ayuda.

    ResponderBorrar
    Respuestas
    1. Claro, en que podemos ayudarte?
      Qué necesitas exactamente?

      Borrar
    2. como se agregaria para exponencias ejemplo 2 al 9765625 :c me manda infinito por el tipo de dato pow solo acepta double

      Borrar
  2. Excelente, pero falta con lo de <= >= entre grandes enteros, etc, necesito ayuda.

    ResponderBorrar
  3. Hola muy buenas tardes... saludos , me piden en la carrera realizar lo siguiente sumar dos numeros extremadamente grandes, tres veces la longitud de tipo de dato de biginteger, de antemano gracias.

    ResponderBorrar
    Respuestas
    1. Disculpa la demora, con gusto te ayudamos.
      ¿Podrías decirnos las características de entrada del programa?

      Buen día :D

      Borrar