Todos nos hemos enfrentado alguna vez desde el bachillerato al cálculo de factoriales, el cálculo es sencillo:
n!=n x (n-1) x ........1
es decir
0!=1
1!=1
2!=2 x 1
3!=3 x 2 x 1
etc
El problema aparece con los números "grandes", ya sólo el valor de 70!, no da el siguiente valor:
70!=11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
un número muy grande, que suele ser el tope de las calculadoras de bolsillo y que nos lo ofrecen sin tantos valores.
Vamos a realizar un test para calcular factoriales usado varios lenguajes de propósito general , y usando buscadores :
Empezamos por los buscadores, la opción más facil:
Empezamos por la opción más rápida (google), el entero más grande que puede procesar a la fecha de edición de este texto es 170!, con un valor de :
Como se puede ver con sólo seis decimales
En el caso de Duck Duck Go, tenemos el siguiete resultado, para un máximo de 170:
Y en en Wolfram Alpha (el que lleva las de ganar):
Sencillamente la parte más agotadora es la de ver todos los números del factorial, que no parecian tener fin.
Entre los Lenguajes de propósito general vamos a usar :
- Java
- Python
Para estos lenguajes es necesario realizar un programa muy corto, el problema es la capacidad de soportar enteros muy grandes, se va a hacer uso de librerias propias de los lenguajes, es decir no se van a usar extensiones de terceros.
Vamos a empezar por los lenguajes de propósito general.
Para el caso de Java el código puede ser:
import java.util.Scanner; // libreria de entrada de datos
import java.math.BigInteger; // libreria de BigInteger
public class bigfactorial
{
public static void main(String[] args)
{
// Factorial para numeros enteros grandes usando BigInteger max 1667!
// sin recursividad
// usar BigDecimal no supone aumentar el valor del factorial calculado
// Generamos la instancia de la entrada
Scanner entrada= new Scanner(System.in);
int numero; // numero el que le vamos a calcular el factorial
BigInteger factorial = BigInteger.valueOf(1);
// introducimos un numero al que le vamos a calcular el factorial
System.out.print("Introduce el numero ");
numero = entrada.nextInt();
entrada.close(); // cerramos el Scanner de entrada
// calculo del factorial mediante BigInteger
for (int i=numero;i>0;i--)
{
factorial = factorial.multiply(BigInteger.valueOf(i));
}
System.out.printf("El valor del factorial de %d es %s\n",numero,factorial.toString());
}
}
La limitación del tipo BigInteger de Java nos lleva hasta 1667, que no está mal del todo
En el caso del código en lenguaje Python, el código sería por ejemplo :
# scrip para calcular el factorial de un número sin
recursividad
numero = int (input("Introduce el número al que
calcular el factorial "))
factorial=1
for n in range(1, numero+1):
factorial*=n
print("El factorial de "+str(numero)+" es
"+str(factorial))
# colocamos un input para que no se cierre la ventana del
sistema operativo
print("pulsa intro para terminar")
tecla = input()
En este caso se cálculo hasta el 25.000! pero este no es el número más grande del que se puede cálcular el factorial de numeros mayores.
También es posible usar :
- Octave
- MatLab
- Mathematica
- etc
que implementan funciones para el cálculo del factorial de un número.