Estaba intentando resolver este ejercicio de www.spoj.com: FCTRL - Factorial
Realmente no tienes que leerlo, solo hazlo si tienes curiosidad :)
Primero lo implementé en C ++ (aquí está mi solución):
#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;
}
Lo cargué como la solución para g ++ 5.1
El resultado fue: Tiempo 0,18 Mem 3,3 M

Pero luego vi algunos comentarios que afirmaban que su tiempo de ejecución era inferior a 0,1. Como no podía pensar en un algoritmo más rápido, intenté implementar el mismo código en 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;
}
Lo cargué como solución para gcc 5.1
Esta vez el resultado fue: Tiempo 0.02 Mem 2.1M

Ahora el código es casi el mismo , agregué std::ios_base::sync_with_stdio(false);al código C ++ como se sugirió aquí para desactivar la sincronización con los búferes stdio de la biblioteca C. También he dividido la printf("%d\n", num_of_trailing_zeros);que printf("%d", num_of_trailing_zeros); printf("%s","\n");para compensar doble llamada de operator<<en cout << num_of_trailing_zeros << "\n";.
Pero todavía vi un mejor rendimiento x9 y un menor uso de memoria en el código C frente a C ++.
¿Porqué es eso?
EDITAR
Me fijo unsigned longa unsigned inten el código C. Debería haber sido así unsigned inty los resultados que se muestran arriba están relacionados con la unsigned intversión new ( ).
