führende Nullen ermitteln.
-
Ne, ist mir zu einfach
DANKE
-
Hallo,
wie wäre es einfach mal ohne Strings?int leadingZeros(double d) { int res = 0; int fak = 10; for (int t; (t = d * fak) == 0 ; fak *= 10) ++res; return res; }
Achtung: Nicht getestet!
-
Danke, die Idee ist einfach genial einfach.
-
Na also, wenn das nicht dem Logarithmus zu knacken ist...
Irgendwie mal den 10er Logarithmus andwenden. Da ein Minus davor dürfte schonmal ziemlich in die richtige Richtung gehen, oder täusche ich mich da?
MfG Jester
-
@Jester
Wäre Möglich, ist aber vom Rechenaufwand sehr aufwendig.Ich hab jetzt ne tolle Lösung auf der Idee von HumeSikkins.
Damit werden alle Nullen nach dem Komma ausgegeben, bis einen andere Ziffer kommt.int leading_zero(double d) { int cnt=0; d=d-(long)d; //Abtrennen der Ziffern vor dem Komma while(true) { d=d*10; if(d<1) cnt++; else return cnt; } return cnt; }
Wie ich finde einfach, genial einfach.
-
Bist Du sicher, daß der log langsamer ist als die Schleife?
Das würde mich wundern.MfG Jester
-
Ich hab es mal probiert, log10 ist langsamer als *
double klein=0.004; start = clock(); for(i=0; i<10000000;i++) log10(klein); finish=clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout<<duration<<" Sekunden"<<endl; printf("\n"); start = clock(); for(i=0; i<10000000;i++) klein=klein*10; finish=clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; cout<<duration<<" Sekunden"<<endl;
Als Ergebnis kommt bei mir:
2.553 Sekunden für log10
2.364 Sekunden für *Ist aber in dem Fall egal, da wohl nie versuchen werde mehr als 10E7 Nullen zu erfragen.
Oder siehst Du das anders?
cu
-
@daishi
Dein Test ist ein Milchmädchen-Test. Wenn dann müsstest du schon das klein = klein * 10 in eine Funktion packen. Sinnvoller wäre aber gleich ein Vergleich der beiden fertigen Lösungen.Wie auch immer: die Geschwindigkeit ist imo ersteinmal zweitrangig. Wichtig ist die Lesbarkeit (bzw. Verständlichkeit) der Lösung.
@Jester
Wie sähe die Funktion unter Anwendung des Logs aus? Ich habe eben ein klein bischen rumgespielt, bin aber leider zu keiner schönen Lösung gekommen.
-
@HumeSikkins
Du hattest recht, es war ein schlechtes Beispiel.
Wenn ich eine Funktion verwende ist log noch langsamerdouble funktion(double x) { return x*10; }
2.553 Sekunden
gegen
1.252 Sekunden
-
Ich glaube hier misst jemand die Geschwindigkeit im Debug.