Stavo cercando di risolvere questo esercizio da www.spoj.com: FCTRL - Factorial
Non devi davvero leggerlo, fallo solo se sei curioso :)
Per prima cosa l'ho implementato in C ++ (ecco la mia soluzione):
#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;
}
L'ho caricato come soluzione per g ++ 5.1
Il risultato è stato: Time 0.18 Mem 3.3M
Ma poi ho visto alcuni commenti che affermavano che il loro tempo di esecuzione era inferiore a 0,1. Dato che non riuscivo a pensare a un algoritmo più veloce, ho provato a implementare lo stesso codice in 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;
}
L'ho caricato come soluzione per gcc 5.1
Questa volta il risultato è stato: Time 0.02 Mem 2.1M
Ora il codice è quasi lo stesso , ho aggiunto std::ios_base::sync_with_stdio(false);
al codice C ++ come suggerito qui per disattivare la sincronizzazione con i buffer stdio della libreria C. Ho anche diviso il printf("%d\n", num_of_trailing_zeros);
a printf("%d", num_of_trailing_zeros); printf("%s","\n");
per compensare la doppia chiamata di operator<<
incout << num_of_trailing_zeros << "\n";
.
Ma ho ancora visto prestazioni migliori x9 e un minore utilizzo della memoria nel codice C rispetto a C ++.
Perché?
MODIFICARE
Ho fissato unsigned long
per unsigned int
il codice C. Avrebbe dovuto essere unsigned int
ei risultati mostrati sopra sono relativi alla nuova unsigned int
versione ( ).