Gerçek çarpımların sadece yarısında faktöriyelleri bulmak için harika bir numara buldum.
Lütfen sabırlı olun çünkü bu biraz uzun bir gönderi.
Çift Sayılar için:
Çarpmayı çift sayılarla yarıya indirmek için, n / 2 çarpanları elde edersiniz. İlk faktör, faktöriyelini aldığınız sayı olacaktır, ardından sonraki bu sayı artı bu sayı eksi iki olacaktır. Bir sonraki sayı, önceki sayı artı son eklenen sayı eksi iki olacaktır. Son eklediğiniz sayı iki olduğunda (yani 2) işiniz bitti . Muhtemelen bu pek mantıklı gelmedi, bu yüzden size bir örnek vereyim.
8! = 8 * (8 + 6 = 14) * (14 + 4 = 18) * (18 + 2 = 20)
8! = 8 * 14 * 18 * 20 which is **40320**
Unutmayın ki 8 ile başladım, sonra ilk eklediğim sayı 6, sonra 4, sonra 2, eklenen her sayı kendisinden önce eklenen sayıdan iki eksi olacaktı. Bu yöntem, en küçük sayıları en büyük sayılarla çarpmaya eşdeğerdir, sadece daha az çarpma ile, örneğin:
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 *
8! = (1 * 8) * (2 * 7) * (3 * 6) * (4 * 5)
8! = 8 * 14 * 18 * 20
Basit değil mi :)
Şimdi Tek Sayılar İçin: Eğer sayı tekse, toplama aynıdır, her seferinde iki çıkarırsınız, ancak üçte durursunuz. Ancak faktörlerin sayısı değişir. Sayıyı ikiye bölerseniz, 5 ile biten bir sayı elde edersiniz. Bunun nedeni, uçları birlikte çarparsak ortadaki sayı ile kalmamızdır. Temel olarak, bunların tümü, ikiye bölünen sayıya eşit bir dizi faktörü yuvarlayarak çözülebilir. Bu muhtemelen matematiksel geçmişi olmayanlar için de pek mantıklı gelmiyordu, öyleyse bir örnek yapayım:
9! = 9 * (9 + 7 = 16) * (16 + 5 = 21) * (21 + 3 = 24) * (roundUp(9/2) = 5)
9! = 9 * 16 * 21 * 24 * 5 = **362880**
Not: Bu yöntemi beğenmezseniz, tek sayıdan önceki çift sayının faktöriyelini de alabilir (bu durumda sekiz) ve tek sayı ile çarpabilirsiniz (yani 9! = 8! * 9).
Şimdi bunu Java'da uygulayalım:
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;
}
isFirststatik olarak bildirilen bir boole değişkendir; önceki toplamı değiştirmek istemediğimiz 1. durum için kullanılır.
Tek sayıların yanı sıra çiftleri de deneyin.