अपने कोड को देखते हुए, यह आश्चर्य की बात नहीं है कि आप बहुत मेमोरी से बाहर निकल जाएंगे। आपकी विधि divideFactorials
विधि फ़ैक्टोरियल को कॉल करती है और "numerator-denominator" अंतर को तर्क के रूप में उपयोग करती है। यह अंतर आपके कोड के अनुसार बहुत बड़ा होने जा रहा है और आप अपने फैक्टोरियल विधि में बहुत लंबे लूप में फंस जाएंगे।
तो यह वास्तव में है बस NCK खोजने के बारे में (जो मुझे लगता है क्योंकि अपने कोड में अपनी टिप्पणी), बस का उपयोग करें:
public static long GetnCk(long n, long k)
{
long bufferNum = 1;
long bufferDenom = 1;
for(long i = n; i > Math.Abs(n-k); i--)
{
bufferNum *= i;
}
for(long i = k; i => 1; i--)
{
bufferDenom *= i;
}
return (long)(bufferNom/bufferDenom);
}
बेशक
इस प्रक्रिया में बहुत तेजी से सीमा से बाहर चला जाएगा का उपयोग कर, क्योंकि एक लंबे समय तक वास्तव में बहुत लंबी संख्या का समर्थन नहीं करता है, इसलिए एन और के को 20 से छोटा होना चाहिए।
मान लीजिए कि आप वास्तव में बहुत बड़ी संख्या के साथ काम करते हैं, आप लंबे समय के बजाय युगल का उपयोग कर सकते हैं, क्योंकि शक्तियां अधिक से अधिक महत्वपूर्ण हो जाती हैं।
संपादित करें: आप बड़ी संख्या का उपयोग करते हैं तो आप भी स्टर्लिंग के फॉर्मूला इस्तेमाल कर सकते हैं:
n के रूप में बड़े ln हो जाता है -> n * ln (एन) - एन (एन!)।
कोड में इस लाना:
public static double GetnCk(long n, long k)
{
double buffern = n*Math.Log(n) - n;
double bufferk = k*Math.Log(k) - k;
double bufferkn = Math.Abs(n-k)*Math.Log(Math.Abs(n-k)) - Math.Abs(n-k);
return Math.Exp(buffern)/(Math.Exp(bufferk)*Math.Exp(bufferkn));
}
के रूप में आप ने कहा कि स्वतंत्र भाषा, सी # कोड बस इसे प्रदर्शित करने के लिए प्रयोग किया जाता है मैं केवल इस उत्तर का प्रस्ताव। चूंकि आपको काम करने के लिए एन और के लिए बड़ी संख्याओं का उपयोग करने की आवश्यकता है, इसलिए मैं बड़े संयोजनों के लिए द्विपक्षीय गुणांक खोजने के लिए इसे सामान्य तरीके के रूप में प्रस्तावित करता हूं।
मामलों के लिए एन और के दोनों 200-300 से छोटे थे, तो आपको उत्तर विक्टर मुखर्जी का प्रस्ताव देना चाहिए, क्योंकि यह सही है।
संपादित 2: मेरा पहला कोड संपादित किया गया।
"द्विपद गुणांक" कहा जाता है और एक बहुत ही आम वस्तु के रूप में, अतः में के समक्ष पेश किया है: http://stackoverflow.com/q/4256188/422353 – madth3
संयोजन किस तरह वास्तव में आप की कोशिश कर रहे प्राप्त? क्या यह बस एनसीके है, या यह कुछ और है? मैं सिर्फ इसलिए पूछ रहा हूं क्योंकि शीर्ष पर आपकी टिप्पणी "एनसीके" कहती है लेकिन आपका कोड सीधे इसकी गणना नहीं करता है। – phil13131
हां, इस लाइन को फैक्टोरियल() में जोड़ें: 'if (n> 20) नया ओवरफ्लो एक्सेप्शन() फेंक दें; ' –