मुझे वास्तविक आधे हिस्से में फैक्टरियल खोजने के लिए एक अद्भुत चाल मिली।
कृपया धैर्य रखें क्योंकि यह एक लंबी पोस्ट का एक छोटा सा है।
सम संख्याओं के लिए: सम संख्याओं
के गुणन को आधा करने के लिए, आप 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**
नोट: यदि आपको यह विधि पसंद नहीं है, तो आप विषम (इस मामले में आठ) से पहले सम संख्या के भाज्य को भी ले सकते हैं और इसे विषम संख्या से गुणा कर सकते हैं (अर्थात ९! = *! * ९)।
अब इसे जावा में लागू करते हैं:
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 मामले के लिए किया जाता है जहां हम पिछली राशि को बदलना नहीं चाहते हैं।
विषम संख्या के लिए भी प्रयास करें।