Я пытался решить это упражнение с сайта www.spoj.com: FCTRL - Factorial
Вам действительно не нужно его читать, просто сделайте это, если вам интересно:)
Сначала я реализовал его в С++ (вот мое решение):
#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 /info/67161/difference-in-execution-time-in-c-and-c/457941#457941)
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
На этот раз результат: Time 0.02 Mem 2.1M
Теперь код почти тот же, я добавил std::ios_base::sync_with_stdio(false);
в код С++, как было предложено здесь, чтобы отключить синхронизацию с буферами 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 и С++.
Почему это?
ИЗМЕНИТЬ
Я зафиксировал unsigned long
до unsigned int
в коде C. Это должно быть unsigned int
, а результаты, которые показаны выше, связаны с новой версией (unsigned int
).