J'ai essayé de résoudre cet exercice de www.spoj.com : FCTRL - Factorielle
Vous n'avez donc pas à le lire, il suffit de faire si vous êtes curieux :)
J'ai d'abord mis en œuvre en C++ (ici c'est ma solution):
#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 http://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;
}
J'ai téléchargé comme la solution pour g++ 5.1
Le résultat a été: Temps 0.18 Mem3.3 M
Mais ensuite j'ai vu certains commentaires qui ont déclaré que leur temps d'exécution est inférieure à 0,1. Puisque je ne pouvais pas penser algorithme plus rapide, j'ai essayé de mettre en œuvre le même code 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;
}
J'ai téléchargé la solution idéale pour les ccag 5.1
Cette fois, le résultat a été: Temps De 0,02 Mem2.1 M
Maintenant, le code est presque la même, j'ai ajouté std::ios_base::sync_with_stdio(false);
pour le code C++ comme il a été suggéré ici pour désactiver la synchronisation avec le C de la bibliothèque stdio tampons. J'ai également divisé l' printf("%d\n", num_of_trailing_zeros);
de printf("%d", num_of_trailing_zeros); printf("%s","\n");
afin de compenser pour le double appel de operator<<
en cout << num_of_trailing_zeros << "\n";
.
Mais je ne voyais toujours x9 de meilleures performances et la plus faible utilisation de la mémoire en C et C++ code.
Pourquoi est-ce?
MODIFIER
J'ai fixé unsigned long
de unsigned int
dans le C du code. Il doit avoir été unsigned int
, et les résultats qui sont présentés ci-dessus sont liés à la nouvelle (unsigned int
) de la version.