Anzahl der Ziffern in Zahl feststellen, vorgehensweise mit Logarithmus?

Gast #2531496
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 :-)
Gast #2531505
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
#2531507
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
Persönliche Seite #2531509
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 ;-)
Gast #2531743
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
Gast #2534334
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren