Comment puis-je déterminer la longueur d'un Fixnum en Ruby?
Dans le script que je suis en train d'écrire, je veux trouver la longueur d'un Fixnum en Ruby. Je pourrais faire <num>.to_s.length
, mais est-il possible de directement trouver la longueur d'un Fixnum sans la convertir en une Chaîne de caractères?
Quelle est la durée d'un
Combien de chiffres sont en elle.
Fixnum
"? Dans quelle représentation?Combien de chiffres sont en elle.
OriginalL'auteur Orcris | 2012-12-22
Vous devez vous connecter pour publier un commentaire.
Vous pourriez ajouter à Fixnum comme ceci:
n.to_s.length
est plus rapide pour tout entier représenté par un Fixnum. Un beaucoup le plus rapide: Sur ma boîte,n.to_s.length
prend quelque part entre un tiers et la moitié du temps du logarithme de la méthode, en fonction de la longueur de la nombre. Si le nombre doit être représentée d'une Bignum, alors le logarithme de la méthode commence à gagner. Les deux méthodes sont très rapides, même si, à environ .6 millisecondes (pour le logarithme de la méthode), et entre 0,2 et 0,3 millisecondes (pour la méthode de chaîne).Sonne comme
Math.log10
doit avoir plutôt inefficace, la mise en œuvre. J'ai juste essayé une méthode simple, qui marche sur une table de toutes les puissances de 10 qui s'inscrivent dans 32/64 bits, et un>=
comparaison pour chacun, c'était un contact plus rapide queMath.log10
, mais encore plus lente queto_s
. Il pourrait être fait plus rapidement en "déroulant" une recherche binaire de la même table, tout comme le déroulement d'une boucle (le tableau ne serait pas nécessaire, pas plus, le même nombre pourraient être codées en dur dans une série de conditions).Watch out. Cela génère une erreur non des nombres positifs.
oui, j'ai remarqué. L'appel de
.abs
a entraîné un avertissement (lors de l'exécution avecruby -w
) que je n'ai pas compris ni pris en charge. J'ai pensé à une erreur était toujours mieux qu'un mauvais résultat de lato_s.size
idée.Avertissement: Ceci permet de diviser par 0.
OriginalL'auteur steenslag
Ruby 2.4 a une Entier#chiffres méthode qui retourne un Tableau contenant les chiffres.
EDIT:
De gérer les nombres négatifs (merci @MatzFan), l'utilisation de la valeur absolue. Entier#abs
Math::DomainError
. Tellement plus Ruby sivérifier mes repères pourquoi vous devriez pas utiliser
.digits
à grande échelle de cas d'utilisationOriginalL'auteur Santhosh
Bien que le haut-voté boucle est gentil, il n'est pas très Rubis et sera lente pour un grand nombre, l' .to_s est une fonction intégrée et donc sera beaucoup plus rapide. PRESQUE universellement fonctions intégrées sera beaucoup plus rapide que construit des boucles ou des itérateurs.
OriginalL'auteur holzru
Note pour Ruby 2.4+
J'ai couru quelques repères sur les différentes solutions, et
Math.log10(x).to_i + 1
est en fait beaucoup plus vite quex.to_s.length
. Le commentaire de @Wayne Conrad est pas à jour. Le nouvelle solution avecchiffres.count
n'est pas au top, loin derrière, surtout avec un plus grand nombre:OriginalL'auteur davegson
D'une autre manière:
OriginalL'auteur Cary Swoveland
Si vous ne voulez pas utiliser les regex, vous pouvez utiliser cette méthode:
OriginalL'auteur CHABANON Julien