Ermitteln der Länge einer Ganzzahl in C
Ich würde gerne wissen, wie ich finden kann, die Länge eines integer in C.
Zum Beispiel:
- 1 => 1
- 25 => 2
- 12512 => 5
- 0 => 1
und so weiter.
Wie kann ich dies in C?
InformationsquelleAutor der Frage marabunta2048 | 2010-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
C:
Warum nicht einfach den Basis-10-Protokoll der absolute Wert der Zahl, Runden Sie ab, und fügen Sie ein? Das funktioniert für positive und negative zahlen, die nicht 0 sind, und vermieden, dass jede beliebige Zeichenfolge verwenden, die Konvertierung Funktionen.
Den
log10
abs
undfloor
Funktionen werden angeboten durch diemath.h
. Zum Beispiel:Sollten Sie wickeln Sie diese in eine Klausel sicherzustellen, dass
the_integer != 0
dalog10(0)
zurück-HUGE_VAL
nachman 3 log
.Darüber hinaus können Sie auf hinzufügen, um das endgültige Ergebnis, wenn die Eingabe negativ ist, wenn Sie interessiert sind, in der Länge der Zahl einschließlich Ihrer negativen Vorzeichen.
Java:
N. B. Die floating-point-Natur die Berechnungen einbezogen, die in dieser Methode möglicherweise langsamer als ein direkter Ansatz. Siehe die Kommentare für Kangkan Antwort für einige Diskussion von Effizienz.
InformationsquelleAutor der Antwort Jordan Lewis
Wenn Sie interessiert sind, in einem schnell und sehr einfach Lösung, die folgende vielleicht am schnellsten sein (dies hängt von der Wahrscheinlichkeitsverteilung der zahlen in Frage):
Während es möglicherweise nicht gewinnen Preise für die genialste Lösung, es ist trivial zu verstehen und auch leicht zu führen - so geht es schnell.
Auf einem Q6600 mit MSC habe ich zudem diese mit der folgenden Schleife:
Diese Lösung nimmt 0.062 s, die zweitbeste Lösung von Pete Kirkham mit einem smart-Logarithmus-Ansatz nimmt 0.115 s - fast doppelt so lange. Doch für zahlen um 10000 und unterhalb der smart-log ist schneller.
Auf Kosten der Klarheit, Sie können mehr zuverlässig schlagen smart-log (zumindest auf einem Q6600):
Diese Lösung ist immer noch 0.062 s in großer Zahl, und verschlechtert sich auf rund 0.09 s für kleinere zahlen schneller in beiden Fällen als das smart-log-Ansatz. (gcc schneller macht-code; 0.052 für diese Lösung und 0,09 s für den smart-log-Ansatz).
InformationsquelleAutor der Antwort Eamon Nerbonne
und das zweite funktioniert für negative zahlen zu:
InformationsquelleAutor der Antwort zed_0xff
Schreiben Sie eine Funktion wie diese:
InformationsquelleAutor der Antwort Kangkan
Länge n:
InformationsquelleAutor der Antwort Fritz G. Mehner
Ja, die Nutzung von sprintf.
Alternativ kann man diese mathematisch mit Hilfe der
log10
Funktion.InformationsquelleAutor der Antwort Jamie Wong
Die Anzahl der Ziffern einer ganzen Zahl
x
gleich1 + log10(x)
. Damit Sie dies tun können:Oder Sie führen eine Schleife zum zählen der Ziffern sich: integer-division durch 10 bis die Zahl 0 ist:
Müssen Sie ein bisschen vorsichtig zurück
1
wenn die ganze Zahl ist0
in die erste Lösung und vielleicht wollen Sie auch zur Behandlung von negativen ganzen zahlen (die Arbeit mit-x
wennx < 0
).InformationsquelleAutor der Antwort IVlad
Der effizienteste Weg sein könnte, mit einem schnellen Logarithmus basierenden Ansatz, ähnlich denen, die verwendet werden, um zu bestimmen, das höchste bit in einem integer.
Diese (ggf. vorzeitige) Optimierung dauert 0.65 s für 20 Millionen Anrufe auf meinem netbook; iterative division wie zed_0xff hat nimmt, 1.6 s, rekursive Aufteilung wie Kangkan nimmt, 1.8 s, und Verwendung von floating-point-Funktionen (Jordan Lewis' code) nimmt eine satte 6.6 en. Mit snprintf nimmt 11.5 s, aber geben Sie die Größe, die Funktionen snprintf erfordert für jedes format, nicht nur Ganzzahlen. Jordan berichtet, dass die Bestellung des timings sind nicht gepflegt, seinen Prozessor, die keine floating-point-schneller als meine.
Das einfachste ist wohl zu Fragen, snprintf für die gedruckte Länge:
InformationsquelleAutor der Antwort Pete Kirkham
Einen richtigen
snprintf
Umsetzung:InformationsquelleAutor der Antwort sam hocevar
InformationsquelleAutor der Antwort Pasi
Können Sie diese -
(data_type)log10(variable_name)+1
ex:
InformationsquelleAutor der Antwort Ashraful
Ganz einfach
InformationsquelleAutor der Antwort Mauro
InformationsquelleAutor der Antwort OK_or_CANCEL
halten die Teilung von zehn bis null, dann wird nur die Ausgabe der Anzahl der Divisionen.
InformationsquelleAutor der Antwort Graphics Noob
Ich glaub ich hab den effizientesten Weg zu finden, der die Länge einer ganzen Zahl
es ist eine sehr einfache und elegante Weise
hier ist es:
InformationsquelleAutor der Antwort shiups
Meiner Meinung nach die kürzeste und einfachste Lösung wäre:
InformationsquelleAutor der Antwort Flo
Mein Weg:
Teilen, solange Zahl nicht mehr durch 10 teilbar:
Ich weiß nicht, wie schnell ist es im Vergleich mit anderen Aussagen..
InformationsquelleAutor der Antwort tBlabs
InformationsquelleAutor der Antwort Ruza