Я пытался решить это упражнение с сайта 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,18 Mem 3,3M
Но затем я увидел некоторые комментарии, в которых утверждалось, что их время выполнения было меньше 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
На этот раз результат был: Time 0.02 Mem 2.1M
Теперь код почти такой же , я добавил 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
и результаты, показанные выше, относятся к версии new ( unsigned int
).