Calcular el factorial en todo tipo de números

publicado por: Anonymous

Verán, me encuentro haciendo una librería de funciones matematicas basándome en las formulas que ya conocemos y he desarrollado una función llamada Fact() para calcular el factorial de un número, esta tiene dos limitaciones:

  1. El factorial más alto que se puede calcular es 20 (20!) usando el tipo de dato long (Entiendo la razón de esta).
  2. Solo funciona con números enteros (8, 16, 32 o 64 bits).

Este es el código que llevo actualmente para los factoriales de números enteros:

public static long Fact(long a)
{
    if (a == 2) return a;
    return a * Fact(a - 1);
}

EDIT:

Actualmente leyendo sobre el tema, si, el factorial solo se calcula para números enteros positivos, pero utilizando la misma herramienta, la calculadora puede realizar esta operación en numeros con punto decimal, ejemplo:

fact(0.8) = 0.931383770980242...

Y que esto se puede lograr por medio de la implementación de la función gamma, la cual no tengo idea de como implementar.

Mi duda es ¿Cómo calcular el factorial de cualquier tipo de número que se introduzca por parametro a la función?

solución

EDIT: Parece que he entendido la pregunta al revés. Para calcular factorial de números decimales (con gamma) no es fácil; en esta respuesta utilizando la técnica de Lanczos :

var g = 7;
var C = [0.99999999999980993, 676.5203681218851, -1259.1392167224028,771.32342877765313, -176.61502916214059, 12.507343278686905, -0.13857109526572012, 9.9843695780195716e-6, 1.5056327351493116e-7];

function gamma(z) {

    if (z < 0.5) return Math.PI / (Math.sin(Math.PI * z) * gamma(1 - z));
    else {
        z -= 1;

        var x = C[0];
        for (var i = 1; i < g + 2; i++)
        x += C[i] / (z + i);

        var t = z + g + 0.5;
        return Math.sqrt(2 * Math.PI) * Math.pow(t, (z + 0.5)) * Math.exp(-t) * x;
    }
}

POST ANTIGUO:

Buenas; para calcular factoriales en esta respuesta ponen un código recursivo que va genial:

long Factorial(long i)
{
    if (i <= 1)
        return 1;
    return i * Factorial(i - 1);
}

Para satisfacer tus limitaciones; justo antes de llamar a la función Factorial debes:

if (i > 20 && i > 0) {
    //Informa que no puedes calcular más de 20
}
else {
    long f = Factorial(i)
}

Si lo prefieres hacer en bucle….

long numeroFactorial = ??;
long result = numeroFactorial ;

for (int i = 1; i < numeroFactorial ; i++)
{
    result = result * i;
}

No entiendo tu definición de número entero, me imagino que te refieres a los números naturales que lo de encima ya respeta.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *