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;
Solo una idea: ¿cómo deben manejarse los números negativos? – Joey
¿Por qué necesita 'std :: string' aquí? Podrías hacer un 'strlen (buffer_length)'. Tampoco necesita el '\ n' y, por lo tanto, no' -1 '. – leemes
Posible duplicado de: http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi