Znalazłem niesamowitą sztuczkę, aby znaleźć silnie w zaledwie połowie rzeczywistych mnożeń.
Prosimy o cierpliwość, ponieważ jest to trochę długi post.
Dla liczb parzystych:
Aby zmniejszyć o połowę mnożenie z liczbami parzystymi, otrzymasz n / 2 współczynniki. Pierwszym czynnikiem będzie liczba, dla której bierzesz silnię, a następnym będzie ta liczba plus ta liczba minus dwa. Następna liczba będzie poprzednią liczbą plus ostatnio dodaną liczbę minus dwa. Skończysz, gdy ostatnią dodaną liczbą było dwa (tj. 2) . To prawdopodobnie nie miało większego sensu, więc pozwólcie, że dam wam przykład.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Zauważ, że zacząłem od 8, potem pierwsza dodana liczba to 6, potem 4, potem 2, każda dodana liczba była o dwa mniej niż liczba dodana przed nią. Ta metoda jest równoważna pomnożeniu najmniejszych liczb przez największe liczby, tylko z mniejszym mnożeniem, na przykład:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Czy to nie proste :)
Teraz dla liczb nieparzystych: Jeśli liczba jest nieparzysta, dodawanie jest takie samo, jak w przypadku każdego odejmowania dwóch, ale zatrzymuje się na trzech. Jednak liczba czynników się zmienia. Jeśli podzielisz liczbę przez dwa, otrzymasz pewną liczbę kończącą się na .5. Powodem jest to, że jeśli pomnożymy razem końce, pozostanie nam środkowa liczba. Zasadniczo to wszystko można rozwiązać, rozwiązując kilka czynników równych liczbie podzielonej przez dwa, zaokrąglając w górę. To prawdopodobnie nie miało większego sensu również dla umysłów bez matematycznego przygotowania, więc pozwól mi zrobić przykład:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Uwaga: Jeśli nie podoba ci się ta metoda, możesz po prostu wziąć silnię liczby parzystej przed nieparzystą (w tym przypadku osiem) i pomnożyć ją przez liczbę nieparzystą (tj. 9! = 8! * 9).
Teraz zaimplementujmy to w Javie:
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;
}
isFirstjest zmienną logiczną zadeklarowaną jako statyczna; jest używany w pierwszym przypadku, w którym nie chcemy zmieniać poprzedniej sumy.
Spróbuj z parzystymi i nieparzystymi liczbami.