2010-09-29 38 views

Respuesta

4

Un poco difícil de manejar números negativos y el caso donde la entrada es cero:

int length(int n) 
{ 
    int len = 0; 
    if (n < 0) { len = 1; n = -n; } 
    while (n > 9) { 
     n /= 10; 
     len++; 
    } 
    return len+1; 
} 
+0

+1 para un enfoque cuidadoso y rápido. La especificación era para contar los dígitos, por lo que no es necesario configurar los valores negativos por separado. Puede iniciar len a 1 y devolver len. –

6

No hay tal función disponible en la biblioteca de C++. Sin embargo, puede usar std::stringstream por simplicidad.

Pruebe esto (también maneja números negativos).

int a =-12345,x; 
    x = std::abs(a) 
    std::stringstream s; 
    s << x; 
    std::cout<<s.str().size(); 
+1

La localización y el factoring son buenos: 'x = a <0? -a: a; ', pero me desharía de x y pondría esa expresión directamente en la transmisión. Muy C++, pero muy pesado. –

2

Tienes que seguir dividiéndolo por 10 (suponiendo que es un número entero). Usted hace esto porque elimina un dígito cada vez que el ciclo itera.

algo en la línea de:

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

Es probable que quiere asegurarse de que el número no es cero, para empezar.

2
int intlen(float num) { 
    int cnt = 0; 
    while(num >= 1) { 
     num = num/10; 
     cnt++; 
    } 
    return cnt; 
} 
+0

¿El número 0 tiene 0 dígitos? – dreamlax

+0

¿Los números negativos tampoco tienen dígitos? – dreamlax

10

Para números positivos, utilice log10:

int a = 1234; 
int len = static_cast<int>(log10(a)+1.); 

Si tiene que ser a fondo:

int length(int a) 
{ 
    int b = abs(a); 
    if (b == 0) return 1; 
    return static_cast<int>(log10(b)+1.); 
} 

Dicho esto, sería una mejor opción para hacer una división repetida por 10 en la práctica.

int length(int a) 
{ 
    int b = 0; 
    for (a = abs(a); a != 0; b++, a /= 10) continue; 
    return b; 
} 
+1

Implica la pregunta: ¿permite el estándar una implementación donde, por ejemplo, 'log10 (10)' devuelve 0,9999999999 ...? Simplemente no sé (o confío en que las implementaciones cumplan ya que harán lo que sea que haga su hardware), así que prefiero los acercamientos int dígito a dígito, aunque esto es más matemáticamente elegante. ¿Pensamientos? –

+0

Esto subestima por 1 - es decir. para su ejemplo de 1234, devuelve 3. Además, no compila (al menos en VC++) porque la llamada a log10 es ambigua: debe convertir explícitamente el int en un doble primero. Y supongo que querías pasar b a log10 en vez de a? – Peter

+0

Te vas por uno. log10 (5) es 0.6989700 ... cuando lo vuelves a un int, obtienes 0. '5 'ciertamente tiene más de cero dígitos. Además, tomas los abdominales (a) y los pones en b, pero luego sigues adelante y tomo el log10 de (posiblemente no positivo) de todos modos – SingleNegationElimination

7

Probablemente significa que tenga una cadena que contiene los números en lugar de un int en Python:

>>> i = 123456789 
>>> len(i) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: object of type 'int' has no len() 
>>> len(str(i)) 
9 

Si este es también el caso de C++ es fácil encontrar la longitud de una cadena usando:

my_str_value.length() 

o para una cadena C utilizando strlen

0

Aquí es un peq e ejemplo:

int numberDigits(int n) { 
    char buffer[100]; 
    itoa(n,buffer,10); 
    int len=0; 
    while (buffer[len]!=0) { len++; } 
    return len; 
} 
+0

Merece la pena incluirlo como una alternativa. Debería omitir cualquier '-' principal. A pesar de evitar strlen(), solo el atoi() seguramente será más lento que otras soluciones div-por-10 .... –

+0

Eso sería un problema si la velocidad es muy sensible en su aplicación. –

5

Hmm ... Python:

>>> len(5) 

Traceback (most recent call last): 
    File "<pyshell#45>", line 1, in <module> 
    len(5) 
TypeError: object of type 'int' has no len() 

no es lo que quería?

Bueno, supongamos que tiene un número entero real. la base de registro 10 le dirá lo que quiere saber numéricamente, es decir, yournumber == pow(10, digits), luego log10(yournumber) == digits! desafortunadamente, si su número no es una potencia exacta de 10, tendrá que lidiar con una parte de la fracción. Sin embargo, eso es bastante fácil de tratar con la función floor(), que acaba de redondearse. tenga cuidado con los números negativos, ya que los logaritmos no están definidos en los números reales para los valores no positivos.

#include <iostream> 
#include <math.h> 

int main() 
{ 
    std::cout << floor(log10(5))+1 << std::endl; 
    std::cout << floor(log10(30))+1 << std::endl; 
    std::cout << floor(log10(2000))+1 << std::endl; 
    std::cout << floor(log10(16000))+1 << std::endl; 
} 

tenemos que agregar 1 porque 10 a la 1 'sigue siendo 10, entonces nos vamos por uno. ¡Añade uno al exponente y tienes dígitos!

+0

Excelente explicación.+1 ¿Cómo te sientes acerca de los posibles problemas de precisión con el punto flotante que surgieron en los comentarios de mi respuesta? – JoshD

+0

@JoshD: bueno, 'log10 (x)' no está definido para x no positivo, pero aparte de eso, siempre será correcto. Tenga en cuenta que 'log10 (10.0)' es exactamente 1.0. el piso de eso es 1, 1 + 1 es dos. – SingleNegationElimination

0

Ignorando por el momento que len() en Python devuelve el número de elementos en una secuencia y no el número de dígitos de un número entero, he aquí una función para contar el número de dígitos de un número entero sin divisoria (por lo que debe ser mucho más rápido que las soluciones similares que usan división).

int number_of_digits(int value) 
{ 
    int count = 0; 
    int i = 1; 

    if (value < 0) 
    { 
     value *= -1; 
    } 

    while (i < value) 
    { 
     count++; 
     i *= 10; 
    } 

    if (count > 0) 
    { 
     return count; 
    } 
    else 
    { 
     return 1; 
    } 
} 

para obtener mayor velocidad, incluso se puede sustituir la multiplicación por diez con algún cambio de bit:

i = ((i << 2) + i) << 1; 

(El desplazamiento de bits es bueno, pero la multiplicación puede ser "libre" si su CPU puede canaliza la multiplicación en alguna unidad de multiplicación que no se use: los procesadores modernos son una belleza).

Cuestiones relacionadas