163 votes

Moyen efficace de déterminer le nombre de chiffres dans un nombre entier

Ce qui est un moyen très efficace de déterminer combien de chiffres il y a dans un entier en C++ ?

118voto

Vitali Points 1112

Eh bien, le moyen le plus efficace, en supposant que vous connaissez la taille de l’entier, serait une recherche. Devrait être plus rapide que l’approche de logarithme basé beaucoup plus courte. Si vous ne se souciez comptant le '-', enlever le + 1.

83voto

Skizz Points 30682

Le moyen le plus simple est de le faire :

log10 est défini dans ou . Vous auriez besoin de profil cela pour voir si il est plus rapide que n’importe lequel des autres posté ici. Je ne sais pas comment robuste, c’est en ce qui concerne la précision de point flottant. En outre, l’argument n’est pas signé comme le journal et les valeurs négatives ne mélangent pas vraiment.

72voto

Brad Points 211

J'ai peut-être mal compris la question, mais est-ce que cela ne le fait pas?

 int NumDigits(int x)  
{  
    x = abs(x);  
    return (x < 10 ? 1 :   
    	(x < 100 ? 2 :   
    	(x < 1000 ? 3 :   
    	(x < 10000 ? 4 :   
    	(x < 100000 ? 5 :   
    	(x < 1000000 ? 6 :   
    	(x < 10000000 ? 7 :  
    	(x < 100000000 ? 8 :  
    	(x < 1000000000 ? 9 :  
    	10)))))))));  
}
 

34voto

squelart Points 5118
 int digits = 0; while (number != 0) { number /= 10; digits++; }
 

Remarque: "0" aura 0 chiffres! Si vous avez besoin que 0 apparaisse pour avoir 1 chiffre, utilisez:

 int digits = 0; do { number /= 10; digits++; } while (number != 0);
 

(Merci Kevin Fegan)

Au final, utilisez un profileur pour savoir laquelle de toutes les réponses sera la plus rapide sur votre machine ...

11voto

blinnov.com Points 139

Blague pratique: C'est le moyen le plus efficace (le nombre de chiffres est calculé lors de la compilation):

 template <unsigned long long N, size_t base=10>
struct numberlength
{
    enum { value = 1 + numberlength<N/base, base>::value };
};

template <size_t base>
struct numberlength<0, base>
{
    enum { value = 0 };
};
 

Peut être utile pour déterminer la largeur requise pour le champ numérique dans la mise en forme, les éléments d'entrée, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X