Páginas

martes, 8 de febrero de 2011

Factorial De Números Grandes En Java

El factorial de un numero n es simplemente la multiplicación de todos los números naturales de 1 a n.

 n! = 1 \times 2 \times 3 \times 4 \times ... \times (n-1) \times n \,

Pero ahora notamos que esta cantidad crece demasiado si queremos calcular el factorial de un numero grande, por ejemplo el factorial de 100 es:

factorial de 100

Tiene exactamente 158 dígitos, en ningún lenguaje de programación conocido existe una tipo de dato primitivo  que soporte 158 dígitos, y que pasaría si quisiéramos calcular 101! tendríamos que multiplicar esta cantidad por 101, te imaginas? Pero bueno ahora como lo hacemos? pues utilizaremos una herramienta de el lenguajes de programación Java llamada BigInteger (disponible en .NET desde el Framework 4, C#, Visual Basic y disponible en varios otros lenguajes actualmente), que hace precisamente manejar números enteros grandes, es si es una clase que también tiene métodos para sumar números grandes y multiplicar números grandes y mucho mas. Se encuentra en el paquete java.math.BigInteger.

Veamos entonces el código de la función factorial en Java.

public static BigInteger factorial(int n) {
BigInteger f = new BigInteger("1");
for (int i = 1; i <= n; i++) {
f = f.multiply(new BigInteger(i + ""));
}
return f;
}

En esta función le mandamos de parámetro el numero del cual queremos calcular el factorial, luego creamos un numero grande f que inicialmente empezara en 1 para luego representar el factorial (el constructor de BigInteger solo acepta String), hacemos lo común en las siguientes líneas multiplicando entre BigInteger’s por eso convertimos al subíndice i en un objeto BigInteger y como el constructor solo acepta cadenas, entonces convertimos a String de la forma mas fácil, concatenando un String vacío, finalmente retornamos un numero entero grande, que luego desde donde lo llamemos lo podemos convertir en String con el método toString().

Descargar Ejemplo (.java)

Antes de que existiera esta herramienta para el manejo de numeros grandes se hacia uso de estructura de datos, como por ejemplo arrays o listas, donde en cada posición existía un digito del numero, en cuestión es eso lo que hace esta clase.

11 comentarios:

  1. El BigInteger es una de las mas grandes ventajas que tiene Java... pero como hacerlo en C++ o algun otro lenguaje que no desponga del manejo de numeros tan grandes??
    Pues se usa un metodo basico aprendido en colegio, multiplicacion paso a paso con cadenas(pues internamente el BigInteger maneja strings)

    ResponderEliminar
  2. como tu dices la solucion para trabajar con numeros grades puede ser trabajar con string, pero podria ser un poco mejor trabajar con vectores, puede parecer moroso al principio pero es interesante ya q un vector puede almacenar casi 99999999 datos...Q almacenes cada digito en una posicion del vector y luego llames a un metodo para multiplicar vectores soluciona el problema...Espero q les haya sido de ayuda

    ResponderEliminar
  3. el principio para manejar números grandes es el cambio de base.
    Por ejemplo, se cambia al número gigante de base 10 a base 10^9, y cada dígito de base 10^9 se puede almacenar en un vector de long.

    El número N estaría siendo expresado en:
    N = V[0]*1 + V[1]*10^9 + V[2]*10^18 + ...
    donde 0,1,2,... son las posiciones de un vector V.

    Al hacer este cambio de base, se facilitan las operaciones básicas como suma, resta, multiplicación, división, etc.

    Solo se manejaría como cadena a la hora de mostrar y leer datos. (por eso Java crea un BigInteger a partir de un String)

    ResponderEliminar
  4. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
    Respuestas
    1. para anonimo que dice
      "esa mierda la sabe hacer mi hermana de 3 años.......dejense de abuso........cualquiera con dos dedos de frente implementa ese algoritmo mierdero......
      Pongan algo que valga la pena.......algo que me saque el aire....".

      primero que todo respeta si tu lo sabes pues bueno felicidades por ti pero deja que otra gente se beneficie de esa información después de que la información sea correcta y verídica no hace ningún daño y segundo si te parece tan facil este tema te propongo que realices el algoritmo siguiente

      sin utilizar operadores logicos ni ciclos ni vectores. SOLO operaciones matematicas decir si un año es bisiesto o no
      y obiamente sin almanaques es decir te deves valer de una formula matematica para realizar el algoritmo

      si no le entiendes empezaste mal.

      Eliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por un administrador del blog.

      Eliminar
  7. Te pido compañero que madures un poco y pongas nombre y apellido en tus comentarios, siempre la cobardía esta en este mundo.

    ResponderEliminar
  8. Me salvaste la vida, y no pesques comentarios estúpidos... solo sigue ayudando a los que no saben y quieren y tienen ganas de aprender

    saludos¡¡¡

    ResponderEliminar
  9. this is a excellent refenrece, thanks for you help.
    Keep programing!!!!!

    Osorio

    ResponderEliminar

Deja tu comentario, agradecimiento, sugerencia o critica.