Ho trovato un trucco straordinario per trovare fattoriali solo nella metà delle moltiplicazioni effettive.
Per favore sii paziente perché questo è un post un po 'lungo.
Per i numeri pari:
per dimezzare la moltiplicazione con i numeri pari, ti ritroverai con n / 2 fattori. Il primo fattore sarà il numero di cui stai prendendo il fattoriale, quindi il prossimo sarà quel numero più quel numero meno due. Il numero successivo sarà il numero precedente più l'ultimo numero aggiunto meno due. Hai finito quando l'ultimo numero che hai aggiunto era due (cioè 2) . Probabilmente non aveva molto senso, quindi lascia che ti faccia un esempio.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Nota che ho iniziato con 8, quindi il primo numero che ho aggiunto è stato 6, quindi 4, quindi 2, ogni numero aggiunto è due in meno del numero aggiunto prima di esso. Questo metodo equivale a moltiplicare i numeri minimi con i numeri maggiori, solo con meno moltiplicazione, in questo modo:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Semplice non è vero :)
Ora per i numeri dispari: se il numero è dispari, l'aggiunta è la stessa, poiché sottrai due ogni volta, ma ti fermi a tre. Il numero di fattori tuttavia cambia. Se dividi il numero per due, finirai con un numero che termina con .5. Il motivo è che se moltiplichiamo le estremità insieme, ci rimane il numero medio. Fondamentalmente, tutto questo può essere risolto risolvendo per un numero di fattori pari al numero diviso per due, arrotondato per eccesso. Probabilmente questo non aveva molto senso neanche per menti senza un background matematico, quindi fammi fare un esempio:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Nota: se non ti piace questo metodo, potresti anche prendere il fattoriale del numero pari prima del numero dispari (otto in questo caso) e moltiplicarlo per il numero dispari (cioè 9! = 8! * 9).
Ora implementiamolo in 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è una variabile booleana dichiarata come statica; viene utilizzato per il 1 ° caso in cui non si vuole modificare la somma precedente.
Prova con numeri pari e dispari.