Próbowałem rozwiązać to ćwiczenie z www.spoj.com: FCTRL - Factorial
Nie musisz tego czytać, po prostu zrób to, jeśli jesteś ciekawy :)
Najpierw zaimplementowałem to w C ++ (oto moje rozwiązanie):
#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;
}
Wgrałem to jako rozwiązanie dla g ++ 5.1
Wynik był następujący: Czas 0,18 Mem 3,3M
Ale potem zobaczyłem kilka komentarzy, które twierdziły, że ich czas wykonania był mniejszy niż 0,1. Ponieważ nie mogłem myśleć o szybszym algorytmie, próbowałem zaimplementować ten sam kod w 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;
}
Wgrałem to jako rozwiązanie dla gcc 5.1
Tym razem wynik był następujący: Czas 0,02 Mem 2,1M
Teraz kod jest prawie taki sam , dodałem std::ios_base::sync_with_stdio(false);
do kodu C ++ tak, jak zasugerowano tutaj, aby wyłączyć synchronizację z buforami stdio biblioteki C. Ja również podzieliła printf("%d\n", num_of_trailing_zeros);
się printf("%d", num_of_trailing_zeros); printf("%s","\n");
, aby zrekompensować podwójnym wezwaniem operator<<
w cout << num_of_trailing_zeros << "\n";
.
Ale nadal widziałem lepszą wydajność x9 i mniejsze zużycie pamięci w kodzie C w porównaniu z C ++.
Dlaczego?
EDYTOWAĆ
I stała unsigned long
się unsigned int
w kodzie C. Powinien był być, unsigned int
a wyniki, które pokazano powyżej, są związane z nową ( unsigned int
) wersją.