2012-06-22 33 views
15

¿Cómo detectar la longitud de un entero? en caso de que tuviera la prueba le: int (234567545);Obtenga la cantidad de dígitos en un int

¿Cómo sé cuánto tiempo el int es? como decirme que hay 9 números dentro de ella ???

he intentado:

char buffer_length[100]; 


    // assign directly to a string. 

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

    string sf = buffer_length; 


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

pero la mayoría de ser una forma más sencilla de hacerlo o más limpia ...

+5

Solo una idea: ¿cómo deben manejarse los números negativos? – Joey

+1

¿Por qué necesita 'std :: string' aquí? Podrías hacer un 'strlen (buffer_length)'. Tampoco necesita el '\ n' y, por lo tanto, no' -1 '. – leemes

+0

Posible duplicado de: http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi

Respuesta

27

¿Qué tal división:

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

o uso el método log10 de <math.h>.

Nota que log10 devuelve double, por lo que tendrá que ajustar el resultado.

+0

Gracias! :) justo lo que necesito saber – user1417815

+0

Aceptar en 6 minutos, como dice :) – user1417815

+2

Nota, 'log (0)' es -infinity y convertir eso en un entero es UB. – Potatoswatter

10

hacer una función:

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

Esto da el resultado incorrecto si num == 0. –

+2

Creo que podemos agregar un simple si antes, mientras que –

+1

Su función funciona, pero ... un poco tarde ... de todos modos, ¡no me detengas de darte +1! – user1417815

3

si "i" es el número entero, entonces

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 ? 
+0

'buf [12]' debería ser suficiente (como máximo 10 dígitos + signo + '\ 0'). – leemes

2

Puede utilizar stringstream para esto como se muestra a continuación

stringstream ss; 
int i = 234567545; 
ss << i; 
cout << ss.str().size() << endl; 
+0

Funcionará, pero es muy ineficiente. –

3
#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; 
} 

Tenga en cuenta que itoa no es una función estándar, incluso si es compatible con muchos compiladores.

+0

'buf [12]' debería ser suficiente (como máximo 10 dígitos + signo + '\ 0'). – leemes

0

mirando a través de Internet es común cometer el error de inicializar la variable de contador a 0 y luego ingresar una prueba de bucle de condición previa siempre que el conteo no sea igual a 0. un bucle do-while es perfecto para evitar esta.

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

es probable que sea más barato para probar si u es inferior a 10 para evitar la división, la subasta e instrucciones cmp uneccessary para los casos en u < .

pero al mismo tiempo sobre ese tema, la optimización, usted podría simplemente probar u contra constantes potencias de diez .

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 
    } 

que le ahorra instrucciones por dígitos, pero es menos adaptable para diferentes radixes inaddition a ser no tan atractiva, y tedioso de escribir a mano, en cuyo caso se prefiere escribir una rutina para escribir la rutina antes de insertarlo en su programa. debido a que C sólo admite números muy finitos, 64 bits, 32 bits, 16bit, 8 bits, usted podría simplemente se limite a la máxima cuando se genera la rutina para beneficio de todos los tamaños.

para dar cuenta de los números negativos, sólo tiene que habías niegasu si u < antes de contar el número de dígitos. por supuesto, primero haciendo que el soporte de rutina firmó números.

si sabe que u < , es probablemente más fácil simplemente escribir, en lugar de escribir la rutina.

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

Nadie parece haber mencionado convertirlo en una cadena, y luego obtener la longitud. No estoy seguro de cómo performant esto es, pero sin duda lo hace en una línea de código :)

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

cout << "LENGTH of " << num << " is " << len << endl; 
// prints "LENGTH of 123456 is 6" 
-1

len = 1 + piso (log10 (n)); // código C++ lib (cmath)

+0

¿Por qué no hay amor por el número pobre '0'? –

Cuestiones relacionadas