martes, noviembre 09, 2010

Operaciones con números grandes - suma

Los lenguajes de programación manejan tipos de datos enteros, en los cuales hay un valor determinado para el número entero más grande que se puede manejar, teniendo en cuenta que para su almacenamiento se utiliza un determinado número de posiciones de memoria. En el caso de JAVA, un número entero ocupa 64 bits de memoria, por lo que el mayor número entero que se puede manejar es 9,223,372,036,854,775,807 equivalente a dos elevado a la 63 menos 1 (más información en el tutotial oficial de java).

El manejo de operaciones aritméticas simples con números enteros mayores al límite máximo permitido se debe manejar utilizando otro tipo de estrategias. Se puede utilizar la clase BigInteger que tiene implementados métodos para suma y multiplicación de números enteros grandes, o se puede hacer un ejercicio de programación utilizando la cadenas de caracteres (ó arreglos de caracteres) y el procedimiento de suma elemental que consiste en alinear los números e ir sumando los dígitos menos significativos de cada número y acumulando la respuesta en una nueva cadena.

A continuación se presenta una primera versión del método de suma de números enteros grandes:

public static String suma(String nA, String nB) {
        String respuesta="";
        int posA = nA.length()-1;
        int posB = nB.length()-1;
        int resto = 0;
        int digA, digB;

        while(posA>=0 || posB>=0) {
            digA = (posA>=0) ? nA.charAt(posA)-'0': 0;
            digB = (posB>=0) ? nB.charAt(posB)-'0': 0;
            int c = digA+digB+resto;
            if(c>=10) { resto=1; c=c-10;}
            else resto=0;
            respuesta=c+respuesta;
            posA--;
            posB--;
        }
        if(resto>0) respuesta=resto+respuesta;
        return respuesta;
}

6 comentarios:

  1. Anónimo1:08 a.m.

    Hola, podrían explicarme para que funciona el -'0' en esta sección digA = (posA>=0) ? nA.charAt(posA)-'0': 0;

    Específicamente que hace??

    Gracias!!

    ResponderBorrar
  2. Anónimo3:45 p.m.

    nunca respondio? o si alguien sabe, podria decirlo por favor

    ResponderBorrar
  3. Anónimo4:16 p.m.

    Supongo que lo hace para convertir a entero el caracter que extrajo de la cadena. Le resta cero para no alterar el dígito.

    ResponderBorrar

Multiprocesamiento recursivo en JAVA 7

Una de las estrategias de diseño de algoritmos más comunes es la de "divide y vencerás", en la cual, un problema de tamaño relativ...