Wie bestimme ich die Länge einer in Ruby Fixnum?
In das Skript Schreibe ich, ich möchte die Länge eines in Ruby Fixnum. Ich konnte tun <num>.to_s.length
, aber gibt es eine Möglichkeit, direkt die Länge der ein Fixnum ohne die Umwandlung in einen String?
- Was ist die "Länge des
Fixnum
"? In welcher Darstellung? - Wie viele stellen in der it.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man hinzufügen, es zu Fixnum wie diese:
n.to_s.length
ist schneller für eine ganze Zahl repräsentiert, die durch ein Fixnum. Ein viel schneller: Auf meiner box, dien.to_s.length
dauert irgendwo zwischen einem Drittel und der Hälfte der Zeit die Logarithmus-Methode, abhängig von der Länge der Zahl. Wenn die Anzahl zu vertreten hat, eine Bignum, dann die Logarithmus-Methode startet, zu gewinnen. Beide Methoden sind sehr schnell, aber bei etwa .6 Millisekunden (für die Logarithmus-Methode) und zwischen 0,2 und 0,3 Millisekunden (für die string-Methode).Math.log10
muss eine eher ineffiziente Umsetzung. Ich habe nur versucht, eine einfache Methode, die Spaziergänge über eine Tabelle aller Potenzen von 10, die passen in 32/64 bit und hat eine>=
Vergleich für jeden-es war ein Hauch schneller alsMath.log10
, aber immer noch langsamer alsto_s
. Es könnte schneller gemacht werden, indem "abrollen" eine binäre Suche in der gleichen Tabelle, genau wie abrollen einer Schleife (die Tabelle wäre nicht mehr benötigt-die gleichen zahlen werden hart-codiert in eine Reihe von Bedingungen)..abs
ergab eine Warnung (bei der Ausführung mitruby -w
), die ich nicht verstanden noch gepflegt. Ich dachte, ein Fehler war immer noch besser als ein Falsches Ergebnis aus derto_s.size
Idee.Ruby 2.4 hat eine Integer#Ziffern - Methode, die ein Array zurückgeben mit den Ziffern.
EDIT:
Behandeln negative zahlen (danke @MatzFan), verwenden Sie den absoluten Wert. Integer#abs
Math::DomainError
. So viel mehr, obwohl Ruby.digits
für große AnwendungsfälleObwohl die top-gestimmt-loop ist nett, es ist nicht sehr Ruby und langsam für große zahlen, die .to_s ist eine integrierte Funktion und werden daher viel schneller. FAST universell built-in-Funktionen werden viel schneller als gebaut, Schleifen, Iteratoren.
Nebenbei für Ruby 2.4+
Ich lief einige benchmarks auf die verschiedenen Lösungen, und
Math.log10(x).to_i + 1
ist eigentlich viel schneller alsx.to_s.length
. Die Kommentar von @Wayne Conrad veraltet ist. Die neue Lösung mitZiffern.count
hinter weit hinter sich, vor allem mit größeren zahlen:Einen anderen Weg:
Wenn Sie nicht möchten, zu verwenden, regex, können Sie diese Methode verwenden:
Haben Sie nicht Lust bekommen, könnten Sie tun, so einfach ist es.