Ich habe versucht, diese Übung von www.spoj.com zu lösen: FCTRL - Factorial
Du musst es nicht wirklich lesen, mach es einfach, wenn du neugierig bist :)
Zuerst habe ich es in C ++ implementiert (hier ist meine Lösung):
#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;
}
Ich habe es als Lösung für g ++ 5.1 hochgeladen
Das Ergebnis war: Zeit 0,18 Mem 3,3M
Aber dann sah ich einige Kommentare, die behaupteten, dass ihre Zeitausführung weniger als 0,1 war. Da ich mir keinen schnelleren Algorithmus vorstellen konnte, habe ich versucht, denselben Code in C zu implementieren :
#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;
}
Ich habe es als Lösung für gcc 5.1 hochgeladen
Diesmal war das Ergebnis: Zeit 0,02 Mem 2,1M
Jetzt ist der Code fast der gleiche , den ich dem hierstd::ios_base::sync_with_stdio(false);
vorgeschlagenen C ++ - Code hinzugefügt habe , um die Synchronisation mit den Standardpuffern der C-Bibliothek zu deaktivieren. Ich teile auch die printf("%d\n", num_of_trailing_zeros);
zu printf("%d", num_of_trailing_zeros); printf("%s","\n");
Doppel Aufruf zu kompensieren operator<<
in cout << num_of_trailing_zeros << "\n";
.
Aber ich sah immer noch eine bessere x9-Leistung und eine geringere Speichernutzung in C vs. C ++ - Code.
Warum ist das so?
BEARBEITEN
Ich unsigned long
habe unsigned int
im C-Code behoben . Es sollte gewesen sein unsigned int
und die oben gezeigten Ergebnisse beziehen sich auf die neue ( unsigned int
) Version.
std::ostringstream
die Ausgabe mit a akkumulieren und am Ende std::cout
auf einmal an alle senden, verringert sich die Zeit auf 0,02. Die Verwendung std::cout
in einer Schleife ist in ihrer Umgebung einfach langsamer und ich glaube nicht, dass es einen einfachen Weg gibt, sie zu verbessern.