Estava a tentar resolver este exercício em www.spoj.com: FCTRL - Factorial
Você realmente não precisa ler, apenas faça se estiver curioso :)
Primeiro eu implementei em C ++ (aqui está minha solução):
#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;
}
Eu carreguei como a solução para g ++ 5.1
O resultado foi: Tempo 0,18 Mem 3,3M
Mas então eu vi alguns comentários que afirmavam que seu tempo de execução era inferior a 0,1. Como não conseguia pensar em um algoritmo mais rápido, tentei implementar o mesmo código em 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;
}
Eu carreguei como a solução para gcc 5.1
Desta vez, o resultado foi: Tempo 0,02 Mem 2,1M
Agora o código é quase o mesmo , adicionei std::ios_base::sync_with_stdio(false);
ao código C ++ como foi sugerido aqui para desligar a sincronização com os buffers stdio da biblioteca C. Também divido o printf("%d\n", num_of_trailing_zeros);
para printf("%d", num_of_trailing_zeros); printf("%s","\n");
para compensar a dupla chamada de operator<<
em cout << num_of_trailing_zeros << "\n";
.
Mas eu ainda vi x9 melhor desempenho e menor uso de memória no código C vs. C ++.
Por que é que?
EDITAR
I fixo unsigned long
para unsigned int
o código C. Deveria ter sido unsigned int
e os resultados mostrados acima estão relacionados à nova unsigned int
versão ( ).