मैं www.spoj.com: FCTRL - Factorial से इस अभ्यास को हल करने की कोशिश कर रहा था
आपको वास्तव में इसे पढ़ने की ज़रूरत नहीं है, अगर आप उत्सुक हैं तो बस इसे करें :)
पहले मैंने इसे C ++ में लागू किया (यहाँ मेरा समाधान है):
#include <iostream>
using namespace std;
int main() {
unsigned int num_of_inputs;
unsigned int fact_num;
unsigned int num_of_trailing_zeros;
std::ios_base::sync_with_stdio(false); // turn off synchronization with the C library’s stdio buffers (from https://stackoverflow.com/a/22225421/5218277)
cin >> num_of_inputs;
while (num_of_inputs--)
{
cin >> fact_num;
num_of_trailing_zeros = 0;
for (unsigned int fives = 5; fives <= fact_num; fives *= 5)
num_of_trailing_zeros += fact_num/fives;
cout << num_of_trailing_zeros << "\n";
}
return 0;
}
मैंने इसे g ++ 5.1 के समाधान के रूप में अपलोड किया
लेकिन फिर मैंने कुछ टिप्पणियां देखीं जिनमें दावा किया गया था कि उनका समय निष्पादन 0.1 से कम था। चूंकि मैं तेज एल्गोरिथ्म के बारे में नहीं सोच सकता था, इसलिए मैंने सी में समान कोड लागू करने की कोशिश की :
#include <stdio.h>
int main() {
unsigned int num_of_inputs;
unsigned int fact_num;
unsigned int num_of_trailing_zeros;
scanf("%d", &num_of_inputs);
while (num_of_inputs--)
{
scanf("%d", &fact_num);
num_of_trailing_zeros = 0;
for (unsigned int fives = 5; fives <= fact_num; fives *= 5)
num_of_trailing_zeros += fact_num/fives;
printf("%d", num_of_trailing_zeros);
printf("%s","\n");
}
return 0;
}
मैंने इसे gcc 5.1 के समाधान के रूप में अपलोड किया
इस बार परिणाम था: समय 0.02 मेम 2.1M
अब कोड लगभग समान है , मैंने std::ios_base::sync_with_stdio(false);
C ++ कोड में जोड़ा है जैसा कि सी लाइब्रेरी के stdio बफ़र्स के साथ सिंक्रनाइज़ेशन को बंद करने के लिए यहां सुझाया गया था । मैं भी विभाजित printf("%d\n", num_of_trailing_zeros);
करने printf("%d", num_of_trailing_zeros); printf("%s","\n");
की दोहरी कॉल के लिए क्षतिपूर्ति करने operator<<
में cout << num_of_trailing_zeros << "\n";
।
लेकिन मैंने अभी भी सी बनाम सी ++ कोड में x9 बेहतर प्रदर्शन और कम मेमोरी उपयोग को देखा ।
ऐसा क्यों है?
संपादित करें
मैंने सी कोड में तय unsigned long
किया unsigned int
। यह होना चाहिए था unsigned int
और जो परिणाम ऊपर दिखाए गए हैं वे नए ( unsigned int
) संस्करण से संबंधित हैं ।