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 long
a unsigned int
en el código C. Debería haber sido así unsigned int
y los resultados que se muestran arriba están relacionados con la unsigned int
versión new ( ).