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
Peter schrieb: > was selbst bei minimal CPUs eigentlich im Überfluss vorhanden ist Jo klar. Ist schon ein Widerspruch in sich.
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
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.