web-dev-qa-db-fra.com

Obtenir le nombre de chiffres dans un int

Comment détecter la longueur d'un entier? dans le cas où j'ai eu le: int test (234567545);

comment puis-je savoir combien de temps l'int est? comme me dire il y a 9 chiffres à l'intérieur ??? 

j'ai essayé :

char buffer_length[100];


    //  assign directly to a string.

    sprintf(buffer_length, "%d\n", 234567545);

    string sf = buffer_length;


    cout <<sf.length()-1 << endl;

mais il y aurait la plupart du temps une façon plus simple de le faire ou plus propre ...

19
user1417815

Que diriez-vous de la division:

int length = 1;
int x = 234567545;
while ( x /= 10 )
   length++;

ou utilisez la méthode log10 de <math.h>

Note que log10 renvoie une double, vous devrez donc ajuster le résultat.

34
Luchian Grigore

Faire une fonction: 

int count_numbers ( int num) {
   int count =0;
   while (num !=0) {   
      count++;  
      num/=10;
   } 
   return count;
}
11
Shehzad Bilal

Personne ne semble avoir mentionné le convertir en chaîne, puis obtenir la longueur. Je ne sais pas à quel point c'est performant, mais ça le fait en une seule ligne de code :)

int num = 123456;
int len = to_string(num).length();

cout << "LENGTH of " << num << " is " << len << endl;
// prints "LENGTH of 123456 is 6"
6
John Grese

si "i" est le nombre entier, alors

int len ;

char buf[33] ;

itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ?

len = strlen(buf) ;

if(i < 0)
    len-- ;    // maybe if you don't want to include "-" in length ?
4
Thorsen

Vous pouvez utiliser stringstream pour cela comme indiqué ci-dessous

stringstream ss;
int i = 234567545;
ss << i;
cout << ss.str().size() << endl;
4
Sanish
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

    int i=2384995;
    char buf[100];

    itoa(i, buf, 10); // 10 is the base decimal

    printf("Lenght: %d\n", strlen(buf));


    return 0;
}

Attention, itoa n'est pas une fonction standard, même si elle est supportée par de nombreux compilateurs.

4
A_nto2

sur Internet, il est courant de commettre l'erreur d'initialiser la variable compteur à 0, puis de saisir un test de boucle de condition préalable tant que le nombre n'est pas égal à 0. Une boucle do-while est parfaite pour éviter cela.

    unsigned udc(unsigned u) //unsigned digit count
    {
      unsigned c = 0;
      do
        ++c;
      while ((u /= 10) != 0);
      return c;
    }

il est probablement moins coûteux de vérifier si u est inférieur à 10 pour éviter les divisions inutiles, les incréments et les instructions cmp dans les cas où u < 10 .

mais en ce qui concerne l'optimisation, vous pouvez simplement tester u contre des puissances constantes de dix .

    unsigned udc(unsigned u) //unsigned digit count
    {
      if (u < 10)   return 1;
      if (u < 100)  return 2;
      if (u < 1000) return 3;
      //...
      return 0; //number was not supported
    }

ce qui vous évite 3 instructions par chiffre, mais est moins adaptable à différentes bases en plus d’être moins attrayant et fastidieux d’écrire à la main, auquel cas vous préféreriez écrire une routine pour écrire la routine avant de l’insérer dans votre programme. parce que C ne prend en charge que les nombres très finis, 64 bits , 32 bits , 16 bits , 8 bits , vous pouvez simplement vous limiter au maximum lors de la génération de la routine pour profiter à toutes les tailles.

pour prendre en compte les nombres négatifs, vous devez simplement nier u si u < 0 avant de compter le nombre de chiffres. bien sûr, tout d’abord, en prenant en charge la routine/ signée nombres.

si vous savez que u < 1000 , .__, il est probablement plus facile d'écrire au lieu d'écrire la routine.

   if (u > 99) len = 3;
   else
   if (u > 9)  len = 2;
   else        len = 1;
0
Anonymous