Encontré un truco increíble para encontrar factoriales en solo la mitad de las multiplicaciones reales.
Tenga paciencia, ya que esta es una publicación un poco larga.
Para números pares:
para dividir a la mitad la multiplicación con números pares, terminará con n / 2 factores. El primer factor será el número del que estás tomando el factorial, luego el siguiente será ese número más ese número menos dos. El siguiente número será el número anterior más el último número agregado menos dos. Ha terminado cuando el último número que agregó fue dos (es decir, 2) . Eso probablemente no tuvo mucho sentido, así que déjame darte un ejemplo.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Tenga en cuenta que comencé con 8, luego el primer número que agregué fue 6, luego 4, luego 2, cada número agregado es dos menos que el número agregado antes. Este método es equivalente a multiplicar los números más pequeños por los números más grandes, solo que con menos multiplicación, así:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Simple, ¿no es así?
Ahora para números impares: si el número es impar, la suma es la misma, ya que resta dos cada vez, pero se detiene en tres. Sin embargo, el número de factores cambia. Si divide el número por dos, terminará con un número que termine en .5. La razón es que si multiplicamos los extremos juntos, nos quedamos con el número del medio. Básicamente, todo esto se puede resolver resolviendo un número de factores igual al número dividido por dos, redondeado hacia arriba. Esto probablemente tampoco tenía mucho sentido para las mentes sin conocimientos matemáticos, así que permítanme hacer un ejemplo:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Nota: Si no le gusta este método, también puede tomar el factorial del número par antes del impar (ocho en este caso) y multiplicarlo por el número impar (es decir, 9! = 8! * 9).
Ahora implementémoslo en Java:
public static int getFactorial(int num)
{
int factorial=1;
int diffrennceFromActualNum=0;
int previousSum=num;
if(num==0) //Returning 1 as factorial if number is 0
return 1;
if(num%2==0)// Checking if Number is odd or even
{
while(num-diffrennceFromActualNum>=2)
{
if(!isFirst)
{
previousSum=previousSum+(num-diffrennceFromActualNum);
}
isFirst=false;
factorial*=previousSum;
diffrennceFromActualNum+=2;
}
}
else // In Odd Case (Number * getFactorial(Number-1))
{
factorial=num*getFactorial(num-1);
}
return factorial;
}
isFirstes una variable booleana declarada como estática; se utiliza para el primer caso en el que no queremos cambiar la suma anterior.
Pruebe tanto con números pares como impares.