एकमात्र अनुकूलन जिसे यहां बनाया जा सकता है (m!/n!
m
में n
से बड़ा है) का मतलब है गुणा का उपयोग करने से पहले आप जो भी कर सकते हैं उसे पार कर सकते हैं।
यदि m
n
से कम है तो हमें पहले तत्वों को स्वैप करना होगा, फिर फैक्टरियल की गणना करना होगा और फिर 1/result
जैसे कुछ बनाना होगा। ध्यान दें कि इस मामले में परिणाम दोगुना होगा और आपको इसे डबल के रूप में संभालना चाहिए।
यहां कोड है।
if (m == n) return 1;
// If 'm' is less than 'n' we would have
// to calculate the denominator first and then
// make one division operation
bool need_swap = (m < n);
if (need_swap) std::swap(m, n);
// @note You could also use some BIG integer implementation,
// if your factorial would still be big after crossing some values
// Store the result here
int result = 1;
for (int i = m; i > n; --i) {
result *= i;
}
// Here comes the division if needed
// After that, we swap the elements back
if (need_swap) {
// Note the double here
// If m is always > n then these lines are not needed
double fractional_result = (double)1/result;
std::swap(m, n);
}
भी उल्लेख करने के लिए (यदि आप कुछ बड़े पूर्णांक कार्यान्वयन की जरूरत है और यह अपने आप क्या करना चाहते हैं) - सबसे अच्छा तरीका है कि ब्लॉक के एक दृश्य के रूप में अपने पूर्णांक के इलाज के लिए तो लागू करने के लिए कड़ी मेहनत कर रहा है नहीं है और सबसे अच्छा है श्रृंखला में अपनी int को विभाजित करने के लिए, जिसमें प्रत्येक 4 अंक होते हैं।
उदाहरण: 1234 | 4567 | 2323 | 2345 | ...
। फिर आपको आवश्यक बुनियादी ढांचे को लागू करना होगा (योग, बहु, शायद पाउ, विभाजन वास्तव में एक कठिन है)।
स्रोत
2010-04-28 17:13:56
यह मुझे लगता है जैसे आप वास्तव में * बड़े कारखानों की गणना * से बचने की कोशिश कर रहे हैं। –
आप यहां कई उत्तरों पा सकते हैं: http://stackoverflow.com/questions/2416483/how-to-find-a- फैक्टोरियल – indiv
आपका प्रश्न क्या है? क्या आप बड़ी संख्या के साथ अंकगणित करने के लिए पूछ रहे हैं, या आप पूछ रहे हैं कि जितना संभव हो उतना सूत्रों की गणना कैसे करें, बिना किसी 'लंबे' या 'लंबे समय तक' के बिना? –