Comment puis-je compter les chiffres dans un entier sans Transtypage de chaîne?

StackOverflow https://stackoverflow.com/questions/554521

  •  23-08-2019
  •  | 
  •  

Question

Je crains qu'il ya une réponse simple et évidente à cette question. Je dois déterminer le nombre de chiffres grand le nombre d'éléments est, de sorte que je peux pad chaque numéro d'article avec le minimum nombre de zéros principaux nécessaires pour maintenir l'alignement. Par exemple, je ne veux pas de zéros si le total est <10, 1 si elle est entre 10 et 99, etc.

Une solution serait de jeter l'élément compte à une chaîne, puis compter les caractères. Beurk! Y at-il une meilleure façon?

Edit: Je ne pensais pas que d'utiliser le (je ne savais pas une telle chose existait). Donc, pas évident - pour moi -. Mais certainement simple,

Était-ce utile?

La solution

Cela devrait le faire:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;

Autres conseils

int length = (int)Math.Log10(Math.Abs(number)) + 1;

Vous devrez peut-être tenir compte du signe négatif ..

Une solution plus efficace que la division répétée serait répétée si les déclarations avec ... par exemple multiplications (Où n est le nombre dont le nombre de chiffres est requis)

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}

S'il y a une limite supérieure raisonnable sur le nombre d'éléments (par exemple la gamme 32 bits d'un entier non signé), puis d'une manière encore mieux est de comparer avec les membres de certains tableaux statiques, par exemple.

// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;

Si vous allez pavé le numéro dans .Net, puis

num.ToString().PadLeft(10, '0') 

peut faire ce que vous voulez.

Vous pouvez utiliser une boucle while, qui sera probablement plus rapide qu'un logarithme, car celui-ci utilise l'arithmétique des entiers seulement:

int len = 0;
while (n > 0) {
    len++;
    n /= 10;
}

Je laisse comme un exercice pour le lecteur d'adapter cet algorithme pour gérer zéro et les nombres négatifs.

J'aurais posté un commentaire, mais mon score de représentant ne me accorde pas cette distinction.

Tout ce que je voulais souligner est que, même si le journal (10) est un très élégant (lire: très peu de lignes de code) solution, il est probablement le plus lourd sur le processeur

.

Je pense que la réponse de jherico est probablement la solution la plus efficace et doit donc être récompensé en tant que tel.

Surtout si vous allez faire cela pour beaucoup de chiffres ..

Depuis plusieurs ne pas des zéros, vous convertissez de toute façon de les ajouter. Je ne sais pas pourquoi vous essayez si dur pour éviter de trouver la longueur lorsque le résultat final devra être une chaîne de toute façon.

Une solution est fournie par logarithme de base 10, un peu exagéré.

Vous pouvez parcourir et supprimer 10, compter le nombre de fois que vous boucle;

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

D'accord, je ne peux pas résister: l'utilisation /=:

#include <stdio.h>

int
main(){
        int num = 423;
        int count = 1;
        while( num /= 10)
                count ++;
        printf("Count: %d\n", count);
        return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $ 
scroll top