Count Digits
Gegeben sei eine nicht negative ganze Zahl n. Gib zurück, wie viele Ziffern sie hat, wenn sie zur Basis 10 ohne führende Nullen geschrieben wird. Null wird als einzelne 0 geschrieben und hat daher eine Ziffer.
Funktion
- ninteger
- die nichtnegative Ganzzahl zum Messen
- Gibt zurückinteger
- die Anzahl der Dezimalstellen in n
Einschränkungen
0 ≤ n ≤ 231-1
Beispiele
- Eingabe
- n = 4096
- Ausgabe
- 4
- Erklärung
- Die Ganzzahldivision durch 10 macht aus
4096409,40und4: Drei Ziffern wurden entfernt und eine blieb übrig, also lautet die Antwort4.
- Eingabe
- n = 0
- Ausgabe
- 1
- Erklärung
0wird mit einer Ziffer geschrieben. Eine Schleife, die zählt, solange die Zahl größer als 0 ist, wird hier nie ausgeführt und gibt0statt1zurück.
- Eingabe
- n = 100
- Ausgabe
- 3
- Erklärung
- Auch Nullen sind Ziffern:
100wird als1,0,0geschrieben, also lautet die Antwort3.
Weiterführende Frage
Kannst du die Ziffern zählen, ohne eine Schleife zu verwenden, die einmal pro Ziffer ausgeführt wird, zum Beispiel mithilfe einer binären Suche über die Zehnerpotenzen?
Tipps
Öffne sie nacheinander. Jeder verrät ein bisschen mehr.
Was passiert mit der Anzahl der Ziffern, wenn du eine Zahl durch 10 teilst und den Rest verwirfst?
Jede ganzzahlige Division durch 10 entfernt genau eine Ziffer am Ende. Zähle, wie viele Divisionen nötig sind, um eine einstellige Zahl zu erhalten.
Starte einen Zähler bei 1 und teile durch 10, solange die Zahl mindestens 10 beträgt, wobei du jedes Mal 1 addierst. Der Start bei 1 ergibt auch für
0die richtige Antwort.
Lösung
Jede ganzzahlige Division durch 10 entfernt eine Ziffer. Zähle die Divisionen, bis eine Ziffer übrig ist, und addiere dann eins für diese Ziffer. Die Fehler liegen an den Rändern: 0 hat eine Ziffer, und eine Logarithmusformel versagt bei 0 und knapp unter großen Zehnerpotenzen.
Schreibe die Zahl als Text und zähle die Zeichen
Idee
Deine Sprache schreibt n bereits dezimal. Frage nach dieser Zeichenfolge und zähle ihre Zeichen: Aus 4096 wird "4096", also vier Zeichen, und aus 0 wird "0", daher ist für null kein Sonderfall nötig.
Die Umwandlung führt eine Division pro Ziffer aus, daher betragen sowohl die Laufzeit als auch der zusätzliche Speicherbedarf O(log n), hier höchstens 10 Zeichen.
Algorithmus
- Wandle
nmit einer Funktion, die nie zur wissenschaftlichen Notation wechselt, in eine Dezimalzeichenfolge um. - Zähle die Zeichen der Zeichenfolge.
- Gib diese Anzahl zurück. Für
0lautet die Zeichenfolge"0", daher ist die Antwort1und es ist keine zusätzliche Prüfung erforderlich.
def countDigits(n):
return len(str(n))So lange durch 10 teilen, bis eine Ziffer übrig ist
Idee
Beginne die Zählung bei 1 und teile durch 10, solange n ≥ 10, wobei du pro Division 1 addierst. Bei 1 zu beginnen bedeutet, dass jede Zahl mindestens eine Ziffer hat. Das ist genau die Regel für 0, daher ist keine separate Prüfung erforderlich.
Die Schleife wird höchstens 9-mal ausgeführt, bei 2147483647: Laufzeit O(log n). Sie verwendet einen Zähler und ändert ihre eigene Kopie von n, daher beträgt der zusätzliche Speicherbedarf O(1).
Algorithmus
- Setze
count = 1für die Ziffer, die immer vorhanden ist. - Solange
n ≥ 10gilt, teilenmit ganzzahliger Division durch 10 und addiere 1 zucount. - Wenn eine Ziffer übrig ist, gib
countzurück.
def countDigits(n):
count = 1 # every number, 0 included, has at least one digit
while n >= 10:
n //= 10
count += 1
return count
Stolperfallen und Grenzfälle
- Zählen ab 0, solange
n > 0gilt. Fürn = 0wird0zurückgegeben. - Verwendung von
floor(log10(n)) + 1. Bei0schlägt es fehl, da der Logarithmus minus unendlich ist, und bei10^15-1, da die doppelte Genauigkeit den Logarithmus auf exakt 15 rundet und die Formel 16 Ziffern ergibt. - Reelle Division in JavaScript, Lua, PHP oder R, bei der
/den Bruchteil beibehält. Eine Schleife, die läuft, solangen > 0gilt, wird dann für4096328-mal ausgeführt. VerwendeMath.floor,math.floor,intdivoder%/%. - Wissenschaftliche Schreibweise in der String-Version. R gibt
as.character(1e5)als"1e+05"aus; verwendesprintf("%.0f", n). In Lua 5.3 und später behälttostring(4096.0)die.0bei; verwendestring.format("%d", n).
Häufige Fragen3
Wie hoch ist die Zeitkomplexität beim Zählen von Ziffern?
Eine Zahl n hat floor(log10(n)) + 1 Ziffern, und die Schleife führt pro Ziffer eine Division aus. Daher läuft sie in O(log n)-Zeit und benötigt O(1) Speicherplatz. Bei einer 32-Bit-Ganzzahl sind das höchstens 10 Schritte.
Kannst du log10 verwenden, um die Ziffern einer Zahl zu zählen?
Für ein positives n ist die Anzahl floor(log10(n)) + 1, aber der Logarithmus wird mit Gleitkommaarithmetik berechnet. Für 0 ist er undefiniert, und nahe einer Zehnerpotenz kann er falsch gerundet werden: log10(10^15-1) ergibt in doppelter Genauigkeit genau 15. Ganzzahldivision ist immer exakt.
Wie zählt man die Ziffern einer negativen Zahl?
Bestimme zuerst den Absolutwert und zähle dann wie gewohnt. String(-42) hat drei Zeichen, da das Minuszeichen keine Ziffer ist. Für die kleinste 32-Bit-Ganzzahl solltest du den Absolutwert in einem 64-Bit-Typ bestimmen, da sie nicht in 32 Bit passt.
Ähnliche Aufgaben
Aufgaben mit denselben Ideen. Wer zwei oder drei davon löst, behält das Muster.
def countDigits(n):
# Schreibe hier den CodeTest #1
Test #2
Test #3
Argument
n = 4096
Erwartete Ausgabe
4