Forum: Compiler & IDEs Anzahl der Ziffern in Zahl feststellen, vorgehensweise mit Logarithmus?


von Ludolf (Gast)


Lesenswert?

Hallo,

angenommen ich habe eine integer Zahl 9264

Der Logaritmus mit der Basis 10 eignet sich prinzipiell ja hervorragend 
dafür?

Mir ist nur die genaue Vorgehensweise ein Rätsel, soll man die Zahl 9264 
durch alle Möglichkeiten, also 1,10,100,1000 und so weiter, nach dem 
Prinzip, Trial and Error teilen oder kann man das auch effizienter 
machen?

Viele Grüße Ludolf, aber nicht vom Schrottplatz :-)

von Tony R. (tony)


Lesenswert?

Die Zahl solange durch 10 teilen, wie der Quotient größer 0 ist. Die 
Anzahl der Ziffern ist die Anzahl der Divisionen inklusive der letzten. 
Bei negativen Werten natürlich andersherum oder den abs nehmen...

von Roger Rithmus (Gast)


Lesenswert?

Ludolf schrieb:
> Mir ist nur die genaue Vorgehensweise ein Rätsel, soll man die Zahl 9264
> durch alle Möglichkeiten, also 1,10,100,1000 und so weiter, nach dem
> Prinzip, Trial and Error teilen oder kann man das auch effizienter
> machen?

Möchtest Du nur die Anzahl der Stellen herausfinden?
Dann ist die folgende Methode recht effizient:
(Beispiel für einen 16-Bit Wert, 0..65 535 )
Von der Ursprungszahl 10 000 abziehen: Kein Überlauf? -> 5 Stellen
Ansonsten:
Von der Ursprungszahl 1 000 abziehen: Kein Überlauf? -> 4 Stellen
Ansonsten:
Von der Ursprungszahl 100 abziehen: Kein Überlauf? -> 3 Stellen
Ansonsten:
Von der Ursprungszahl 10 abziehen: Kein Überlauf? -> 2 Stellen
Ansonsten:
Von der Ursprungszahl 1 abziehen: Kein Überlauf? -> 1 Stellen
Ansonsten: 0 Stellen

von Daniel P. (dpolz)


Lesenswert?

Der effizienteste "Algorithmus" wäre wohl, einfach einen Vergleich mit 
den Zehnerpotenzen anzustellen. Division in Software kostet bei großen 
Zahlen deutlich mehr Zeit, da ja in mehrere Subtraktionen, Vergleiche 
und Sprünge aufgeteilt wird. Logarithmus ist auch eklig.

cpi r16, 10
brlo einstellig
cpi r16, 100
brlo zweistellig
rjmp dreistellig

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ludolf schrieb:
> Hallo,
>
> angenommen ich habe eine integer Zahl 9264
>
> Der Logaritmus mit der Basis 10 eignet sich prinzipiell ja hervorragend
> dafür?

Ja, mit dem Logarithmus lässt sich die Anzahl der Ziffern "geschlossen" 
ausdrücken für eine natürliche Zahl:

1) Berechne den Logarithmus der Zahl. Und zwar zu der Basis b,
   bezüglich der die Anzahl die Ziffern zu bestimmen ist.

2) Runde die Zahl nach unten ab auf die nächste ganze Zahl.
   Ist die Zahl bereits ganz, so wird sie nicht verändert.

3) Zähle 1 drauf.

Voilà

Ob es praktikabel ist, log einzusetzten, hängt vom den 
Einsatzbedingungen ab. Für die Zahl oben und für Menschen ist es z.B. 
einfacher, bis 4 zu zählen ;-)

von Peter (Gast)


Lesenswert?

Wie im anderen Thread schon geschrieben, ich bin ein Freund von den in C 
vorhandenen Boardmitteln.
Einfach mit mit itoa oder ltoa in einen String wandeln und mit strlen 
die Anzahl der Stellen bekommen.
Auch hier wieder, es muss genügend Zeit, RAM und FLASH vorhanden sein, 
was selbst bei minimal CPUs eigentlich im Überfluss vorhanden ist

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter schrieb:

> was selbst bei minimal CPUs eigentlich im Überfluss vorhanden ist

Jo klar. Ist schon ein Widerspruch in sich.

von Peter D. (peda)


Lesenswert?

Am schnellsten gehen Vergleiche:
1
uint8_t digits( uint16_t val )
2
{
3
  uint8_t i = 1;
4
  switch( val ){
5
    default:            i++:
6
    case 1000 ... 9999: i++;
7
    case 100 ... 999:   i++;
8
    case 10 ... 99:     i++;
9
    case 0 ... 9:       return i;
10
  }
11
}

Peter

von newbie (Gast)


Lesenswert?

@PEDA

Bei Deiner Lösung mit switch case ohne break musste ich zweimal 
hinschauen, bis ich die Funktion verstanden haben.

Über den Einstiegspunkt in die nach Größe geordneten cases und das 
fehlende break pro case wird das i++ entsprechend oft ausgeführt.

Dieses Konstrukt hat was, ist aber wahrscheinlich für einen Newbie wie 
mich etwas zu anspruchsvoll.

von (prx) A. K. (prx)


Lesenswert?

Insbesondere aber gehört "case 1 ... 10:" nicht zum C Standard, ist eine 
Spracherweiterung in GCC.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.