2016-12-19 5 views
6

में न्यूटन बिनोमियल गुणांक के साथ समस्या मुझे न्यूटन बिनोमियल गुणांक के लिए मेरे कार्यक्रम के साथ कोई समस्या है। सबसे पहले यह नकारात्मक संख्याओं को मुद्रित करता था लेकिन फैक्टरियल फ़ंक्शन प्रकार को unsigned long long में बदलने से नकारात्मक संख्याओं को प्रिंट करने में समस्या ठीक हो गई थी। कार्यक्रम अधिकतम n = 20 के लिए काम करता है, इसके ऊपर यह शून्य, एक और जुड़वां प्रिंटिंग शुरू करता है। कोई फर्क नहीं पड़ता कि इसे कैसे ठीक किया जाए और उम्मीद है कि कोई मुझे हाथ दे सकता है।सी ++

+7

फैक्टोरियल बहुत तेज़ी से बहुत बड़ा हो जाता है। क्या आप अभिव्यक्ति को सरल बनाने के तरीके के बारे में सोच सकते हैं ताकि मध्यवर्ती शब्द इतने बड़े न हों? उनमें से बहुत से कारक रद्द हो जाते हैं। – BoBTFish

उत्तर

7

फैक्टोरियल आमतौर पर बहुत बड़े होते हैं, इसलिए आपके पास यहां एक पूर्णांक ओवरफ़्लो है। इस समस्या को हल करने के लिए आपको गणना के किसी भी अन्य एल्गोरिथ्म को लागू कर सकता है factorials का उपयोग नहीं कर C(n, k), उदाहरण के लिए:

unsigned long long C(unsigned n, unsigned k) { 
    if (n == k || k == 0) { 
     return 1; // There's exactly one way to select n or 0 objects out of n 
    } 
    return C(n - 1, k - 1) * n/k; 
} 

यहाँ निम्नलिखित आवर्तक शासन प्रयोग किया जाता है: C(n, k) = C(n - 1, k - 1) * n/kC(n, k) = n!/(k! (n-k)!) = (n/k) * (n-1)!/((k-1)!(n-1-k+1)!) के बाद से साबित करना बहुत आसान है।

+1

क्या यह कभी खत्म नहीं होगा यदि 'n! = K'? – Ruslan

+0

@ रुस्लान हां, गलत छाप। फिक्स्ड – alexeykuzmin0

+1

यह लगभग है जैसे कि फ़ंक्शन को भी रिकर्सिव नहीं होना चाहिए .. – Dialecticus