Zahl in Ziffern zerlegen und abspeichern.
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
Ach mist, und dann noch negative
n
.#include <math.h> unsigned get_num_digits(int n) { double digits = floor(log10(abs(n))) + 1; return isinf(digits) ? 0 : digits; }
-
@Bushmaster sagte in Zahl in Ziffern zerlegen und abspeichern.:
vielleicht poste ich nachher eine version ganz ohne schleifen. denn bekommt das while-hasser-männchen einen herzinfarkt.
Nicht jeder Thread ist ein Schwanzvergleich.
char* ultimate_expl0der(char *dst, long long number, unsigned base) { number = number < 0 ? -number : number; long long next_number = number / base; char *tmp = next_number ? 1 + ultimate_expl0der(dst, next_number, base) : dst; int digit = number % base; *tmp = digit < 10 ? '0' + digit : 'a' + digit - 10; return tmp; }
-
@daniwe sagte in Zahl in Ziffern zerlegen und abspeichern.:
int ziffer = 12345 int n= tollerziffernlängenrechner ( ziffer)
....Wahrscheinlich gibt es sowas nicht, gel?
Nennt sich Rekursion und gehört nicht in Kinderhände/produktiven Code.
int f(int x) { return !!x+(x?f(x/10):0); } int main() { int x = 12345; int n = f(x?x:1); return 0; }
Die nichtrekursive Variante funktioniert ab C99:
int main() { int x = 12345; int n = snprintf(0,0,"%d",abs(x)); return 0; }
-
Dieser Beitrag wurde gelöscht!
-
Siehe auch Slides 17&18 hier, Funktion "digits10":
https://de.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c@titan99_: verstehe nicht, was du uns damit sagen willst.
-
Dieser Beitrag wurde gelöscht!
-
Dieser Beitrag wurde gelöscht!
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
for (i = 0; /* true */; i++) // i bekommt den wert 0 zugewiesen, die for-Schleife laeuft solange true // und das Statement i++ wird nach jedem Schleifendurchlauf ausgefuehrt. { array[i] = new % 10; if (new /= 10) continue; else break; }
das lässt sich nochmal verkürzen, als Demo zum Verstehen des Codes aber nicht mehr so gut:
for (i = 0; /* true */; i++) { array[i] = new % 10; if (!(new /= 10)) break; }
und nochmal:
for (i = 0; array[i] = new % 10, new /= 10 ; i++);
-
Hi Zamm',
ich wühle den Thread nochmal auf, da ich noch über etwas gestolpert bin, was ich so hingenommen habe, ohne es wirklich zu verstehen.
Zur Erinnerung: Es ging sich darum eine Zahl "new" in die einzelnen Ziffern zu zerlegen.
array[i] = new % 10; if (new /= 10) continue; else break;
das:
if (new /= 10)
bedeutet ja eigentlich:
if (new= new/10)
in wie fern ist diese Bedingung erfüllt, wenn new 1234 ist? Warum hört die If Schleife dann auf, wenn die letzte Ziffer erreich ist?
Grüße
-
@daniwe Irgendwann gibt
new / 10
=0
und0
istfalse
(alles andere ungleich0
isttrue
). beachte daß es sich um eine Ganzzahldivision handelt.
-
Wurde hier Rekursion schon genannt?
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%d ", x % 10); } } int main(int argc, char const *argv[]) { print(1234567890); return 0; }
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Wurde hier Rekursion schon genannt?
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%d ", x % 10); } } int main(int argc, char const *argv[]) { print(1234567890); return 0; }
ub.
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Wurde hier Rekursion schon genannt?
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%d ", x % 10); } } int main(int argc, char const *argv[]) { print(1234567890); return 0; }
ub.
Was soll daran ub sein? Das ist höchstens nicht well-formed, aber wenn es übersetzt ist das 100% definiert.
-
@SeppJ Beim Parametertyp ultraschlau sein wollen und nicht zu ende denken -> ub.
-
@daniwe sagte in Zahl in Ziffern zerlegen und abspeichern.:
Hi Zamm',
ich wühle den Thread nochmal auf, da ich noch über etwas gestolpert bin, was ich so hingenommen habe, ohne es wirklich zu verstehen.
Zur Erinnerung: Es ging sich darum eine Zahl "new" in die einzelnen Ziffern zu zerlegen.
array[i] = new % 10; if (new /= 10) continue; else break;
das:
if (new /= 10)
bedeutet ja eigentlich:
if (new= new/10)
in wie fern ist diese Bedingung erfüllt, wenn new 1234 ist? Warum hört die If Schleife dann auf, wenn die letzte Ziffer erreich ist?
Grüße
Ne,
if( new /= 10 )
bedeutetif( new /=10 != 0 )
. Bin kein Freund von solchen "Optimierungen".
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
Beim Parametertyp ultraschlau sein wollen und nicht zu ende denken
Was soll daran nicht durchdacht sein, es ist lediglich die bisher lesbarste Rekursion. Natürlich stellt 0 ein Sonderfall dar. Und das rekursiver Code in Produktivsystemen nicht eingesetzt werden sollte, ist auch Quatsch, da
int64_t
oderuint64_t
nur eine sehr begrenzte Anzahl an Dezimalziffern besitzt (nämlich 20). Manchmal denke ich, die Leute sind einfach nur dumm oder wollen eben provozieren.
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
Manchmal denke ich, die Leute sind einfach nur dumm oder wollen eben provozieren.
Manchmal denke ich, die Leute lesen einfach nicht richtig oder verstehen nicht richtig, was jemand schreibt oder meint.
@Swordfish wies hin auf den Paramtertyp!
int64_t
- wo könnte das relevant sein? Gegebenfalls warnt sogar der Compiler? Formatstrings und so!
-
Warnung: Format »%d« erwartet Argumenttyp »int«, aber Argument 2 hat Typ »int64_t {aka long int}« [-Wformat=] printf("%d ", x % 10);
#include <stdio.h> void print(int64_t x) { if (x) { print(x / 10); printf("%ld ", x % 10); } } int main(int argc, char const *argv[]) { print(-10000000000); return 0; }
So besser?
-
@EinNutzer0 sagte in Zahl in Ziffern zerlegen und abspeichern.:
So besser?
Nein.
und andernorts wie der gottgesanndte Messias tun. Boah ey.
-
#include <stdio.h> void print1(uint64_t); void print0(int64_t x) { if (!x) { printf("%ld ", x); } else { if (x < 0) { printf("-"); print1(-x); } else { print1(x); } } printf("\n"); } void print1(uint64_t x) { if (x) { print1(x / 10); printf("%lu ", x % 10); } } int main(int argc, char const *argv[]) { print0(0); print0(-1); print0(+1); print0(-123); print0(+123); return 0; }