Eu descobri um truque incrível para encontrar fatoriais em apenas metade das multiplicações reais.
Por favor, seja paciente, pois esta é uma postagem um pouco longa.
Para números
pares : Para reduzir pela metade a multiplicação com números pares, você acabará com n / 2 fatores. O primeiro fator será o número do qual você está tirando o fatorial, então o próximo será aquele número mais aquele número menos dois. O próximo número será o número anterior mais o último número adicionado menos dois. Você terá terminado quando o último número adicionado for dois (ou seja, 2) . Isso provavelmente não fazia muito sentido, então deixe-me dar um exemplo.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Observe que comecei com 8, depois o primeiro número que adicionei foi 6, depois 4 e 2, cada número adicionado sendo dois a menos que o número adicionado antes dele. Este método equivale a multiplicar o menor número pelos maiores números, apenas com menos multiplicação, assim:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Simples, não é :)
Agora, para números ímpares: Se o número for ímpar, a soma é a mesma, já que você subtrai dois de cada vez, mas pára no três. O número de fatores, entretanto, muda. Se você dividir o número por dois, acabará com algum número terminando em 0,5. A razão é que, se multiplicarmos as pontas, ficamos com o número do meio. Basicamente, tudo isso pode ser resolvido resolvendo para um número de fatores igual ao número dividido por dois, arredondado para cima. Isso provavelmente não fazia muito sentido para mentes sem formação matemática, então deixe-me dar um exemplo:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Nota: Se você não gostar deste método, você também pode simplesmente pegar o fatorial do número par antes do ímpar (oito neste caso) e multiplicá-lo pelo número ímpar (ou seja, 9! = 8! * 9).
Agora vamos implementá-lo em 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;
}
isFirsté uma variável booleana declarada como estática; é usado para o primeiro caso em que não queremos alterar a soma anterior.
Experimente com números pares e ímpares.