Я знайшов дивовижну хитрість знайти фактичні факти лише в половині реальних множин.
Будьте терплячі, оскільки це трохи довгий пост.
Для
парних чисел : щоб удвічі зменшити множення на парні числа, ви отримаєте n / 2 коефіцієнтів. Першим фактором буде число, яке ви приймаєте фактор, тоді наступним буде це число плюс це число мінус два. Наступним числом буде попереднє число плюс тривале додане число мінус два. Ви робите, коли останнє додане вами число було два (тобто 2) . Це, мабуть, мало особливого сенсу, тому дозвольте навести приклад.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Зауважте, що я почав з 8, тоді перше додане мені число було 6, потім 4, потім 2, кожне додане число було на два менше, ніж число, додане до нього. Цей метод еквівалентний множенню найменших чисел на найбільші числа, просто з меншим множенням, наприклад:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Просто не так :)
Тепер для непарних чисел: Якщо число непарне, додавання буде таким самим, як і у вас віднімають два щоразу, але ви зупиняєтесь на трьох. Однак кількість факторів змінюється. Якщо ви розділите число на два, ви отримаєте деяке число, що закінчується .5. Причина полягає в тому, що якщо ми помножимо кінці разом, то нам залишиться середнє число. В основному, це все можна вирішити, вирішивши для ряду факторів, рівних числу, поділеному на два, округлим. Це, мабуть, не мало сенсу ні розумам без математичного походження, тому дозвольте мені зробити приклад:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Примітка: Якщо вам цей метод не подобається, ви також можете просто взяти коефіцієнт парного числа до непарного (у цьому випадку вісім) і помножити його на непарне число (тобто 9! = 8! * 9).
Тепер реалізуємо його на 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булева змінна, оголошена статичною; він використовується для 1-го випадку, коли ми не хочемо змінювати попередню суму.
Спробуйте як з парними, так і з непарними номерами.