Hace poco estuve haciendo un programa que sea necesario para verificar el número de dígitos de un número ingresado por el usuario. Como resultado, he hecho el siguiente código:

int x;    
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
  count++;
  x = x/10;
}

De lo que puedo decir (incluso con mi limitada experiencia) es que parece crudo y en lugar unelegant.

¿Alguien tiene una idea de cómo mejorar este código (aunque no el uso de un sistema de función de c++)?

Estoy asumiendo x es un int o de lo contrario esto será nunca llegar 0
que hacer la división antes de que el bucle?
“Crudo y unelegant” es lo que usted está atascado si usted no puede utilizar mediante las funciones integradas.
¿Qué quieres decir, no incorporado funciones? En las CPUs ARM por ejemplo, el operador de división es un sistema de función.
Lo siento, tengo que aclarar. Estoy suponiendo que no es un método para contar el número de dígitos de un número entero utilizando alguna función en el estándar de C++ biblioteca(yo por supuesto, puede que esté equivocado). Para aprender más acerca de C++ me he decidido a intentar hacer la mayor parte del código de mí, sólo para tener una idea de cómo los trabajos de cosas de ahí el intento de tratar de contar el número de dígitos “manualmente”.

OriginalEl autor E.O. | 2011-07-06

7 Comentarios

  1. 12

    En su particular ejemplo, se puede leer el número como una cadena y contar el número de caracteres.

    Pero para el caso general, puede hacerlo a tu manera o puede utilizar un logaritmo en base 10.

    Aquí es el logaritmo ejemplo:

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
        double n;
        cout << "Enter a number: ";
        cin >> n;
    
        cout << "Log 10 is " << log10(n) << endl;
        cout << "Digits are " << ceil(log10(fabs(n)+1)) << endl;
        return 0;
    }
    +1 para el logaritmo en base 10 (log10 en <cmath> encabezado).
    log10(10) == 1, así que yo creo que necesita floor(log10(n)) + 1.
    Sí tienes razón. Voy a solucionarlo.
    Intente x=0 o x=-1 o x=999.999.
    Vamos a definir este programa es de dominio como parte integral de los números desde el 1 hasta el infinito. A pesar de que hice fix it para manejar números negativos. 🙂

    OriginalEl autor Zan Lynx

  2. 5
    int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;
    No, esto da el resultado correcto excepto para x = 0, corregido.
    Por supuesto, mi error. Comentario eliminado.

    OriginalEl autor David Hammen

  3. 2

    Se podía leer la entrada del usuario como una cadena y, a continuación, el recuento de los personajes? (Después de la esterilización y de corte, etc.)

    Alternativamente, usted podría conseguir a una biblioteca para hacer el trabajo duro por usted; convertir el valor de una cadena y, a continuación, el recuento de los personajes:

    cin >> x;
    stringstream ss;
    ss << x;
    int len = ss.str().length();
    esto no funciona para una gran doble como 1.44224 e+295

    OriginalEl autor Oliver Charlesworth

  4. 1

    Si x es un número entero, y por “construido en la función de” no exclusión de los logaritmos, entonces usted podría hacer

    double doub_x=double(x);
    double digits=log(abs(doub_x))/log(10.0);
    int digits= int(num_digits);

    OriginalEl autor Dan

  5. 1

    Dado una muy segmentado de la cpu con el condicional se mueve, este ejemplo puede ser más rápido:

    if (x > 100000000) { x /= 100000000; count += 8; }
    if (x > 10000) { x /= 10000; count += 4; }
    if (x > 100) { x /= 100; count += 2; }
    if (x > 10) { x /= 10; count += 1; }

    ya que está totalmente extendida. Un buen compilador también puede desenrollar el bucle while para un máximo de 10 iteraciones, aunque.

    OriginalEl autor dascandy

  6. 0
    #include<iostream>
    using namespace std;
    int main()
    {
    int count=0;
        double x;
        cout << "Enter a number: ";
        cin >> x;
        x /= 10;
        while(x > 1)
        {
          count++;
          x = x/10;
        }
        cout<<count+1;
    }
    Un comentario que acompaña al código sería bienvenida.

    OriginalEl autor reza

  7. -1

    La barra de sugerencias de lectura el número como una cadena, su actual método de contar el número de dígitos decimales está bien. Usted puede hacer que sea más corto, pero este podría decirse que es menos claro (extra entre paréntesis añadido para mantener el gcc de la emisión de advertencias):

    while((x = x/10))
      count++;

    OriginalEl autor Lyke

Dejar respuesta

Please enter your comment!
Please enter your name here