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 :-)
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...
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
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
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 ;-)
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
@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.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.