Я намагався вирішити цю вправу з 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. Оскільки я не міг думати про швидший алгоритм, я спробував реалізувати той самий код на C :
#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,1 М
Тепер код майже такий самий , я додав std::ios_base::sync_with_stdio(false);
до коду C ++, як було запропоновано тут, щоб вимкнути синхронізацію з буферами stdio бібліотеки C. Я також розколоти , printf("%d\n", num_of_trailing_zeros);
щоб printf("%d", num_of_trailing_zeros); printf("%s","\n");
компенсувати подвійний виклик operator<<
в cout << num_of_trailing_zeros << "\n";
.
Але я все-таки бачив x9 кращу продуктивність та менший обсяг пам'яті в коді на C та C ++.
Чому так?
РЕДАГУВАТИ
Я встановив , unsigned long
щоб unsigned int
в коді C. Це мало бути, unsigned int
і результати, які наведені вище, пов’язані з новою ( unsigned int
) версією.