J'ai trouvé une astuce incroyable pour trouver des factorielles dans seulement la moitié des multiplications réelles.
Veuillez être patient car il s'agit d'un article un peu long.
Pour les nombres
pairs : pour réduire de moitié la multiplication avec des nombres pairs, vous vous retrouverez avec n / 2 facteurs. Le premier facteur sera le nombre dont vous prenez la factorielle, puis le suivant sera ce nombre plus ce nombre moins deux. Le numéro suivant sera le numéro précédent plus le dernier numéro ajouté moins deux. Vous avez terminé lorsque le dernier numéro que vous avez ajouté était de deux (c'est-à-dire 2) . Cela n'a probablement pas beaucoup de sens, alors laissez-moi vous donner un exemple.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Notez que j'ai commencé par 8, puis le premier nombre que j'ai ajouté était 6, puis 4, puis 2, chaque nombre ajouté étant deux de moins que le nombre ajouté avant lui. Cette méthode équivaut à multiplier les moindres nombres avec les plus grands nombres, juste avec moins de multiplication, comme ceci:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Simple n'est-ce pas :)
Maintenant pour les nombres impairs: Si le nombre est impair, l'addition est la même, comme dans vous soustrayez deux à chaque fois, mais vous vous arrêtez à trois. Le nombre de facteurs change cependant. Si vous divisez le nombre par deux, vous vous retrouverez avec un nombre se terminant par 0,5. La raison en est que si nous multiplions les extrémités ensemble, il nous reste le nombre du milieu. Fondamentalement, tout cela peut être résolu en résolvant un nombre de facteurs égal au nombre divisé par deux, arrondi vers le haut. Cela n'a probablement pas beaucoup de sens non plus pour les esprits sans connaissances mathématiques, alors laissez-moi faire un exemple:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Remarque: Si vous n'aimez pas cette méthode, vous pouvez aussi simplement prendre la factorielle du nombre pair avant l'impair (huit dans ce cas) et la multiplier par le nombre impair (c'est-à-dire 9! = 8! * 9).
Maintenant, implémentons-le 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;
}
isFirstest une variable booléenne déclarée comme statique; il est utilisé pour le 1er cas où l'on ne souhaite pas modifier la somme précédente.
Essayez avec des nombres pairs et impairs.