Zahl in Ziffern zerlegen und abspeichern.
-
@Swordfish AHHH jetzt JAAAA!
-
@Swordfish Super erklärt, danke.
Gibt es eigentlich eine Möglichkeit, mit einem Funktionsaufruf, die Ziffernlänge einer Zahl zu bestimmen?
Ich stelle mir sowas vor:
int ziffer = 12345 int n= tollerziffernlängenrechner ( ziffer)
....Wahrscheinlich gibt es sowas nicht, gel?
-
Proof: How many digits does a number have? ⌊log10 n⌋ +1
~>
floor(log10(n)) + 1
... aber was da fürn = 0
herauskommt?double num_digits = floor(log10(n)) + 1; num_digits = isinf(num_digits) ? 0 : num_digits;
? Ach, ich kenn mich mit diesem Mathezeugs nicht aus. Ach mist, und dann noch negative
n
.
-
@Swordfish sagte in Zahl in Ziffern zerlegen und abspeichern.:
Proof: How many digits does a number have? ⌊log10 n⌋ +1
~>
floor(log10(n)) + 1
... aber was da fürn = 0
herauskommt?int n=1235; int anzahl; anzahl= log10(n) + 1;
Funktioniert für meine Zwecke super, mit den Spezialfällen n=0, n<0 habe ich zum Glück nichts zu tun.
@Swordfish Vielen Dank, you made my day!
-
@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.