Como calcular cuantos dígitos tiene un entero

Iniciado por kutcher, 24 Julio 2014, 22:02 PM

0 Miembros y 1 Visitante están viendo este tema.

Blaster

#10
Cita de: leosansan en  3 Agosto 2014, 23:46 PM
Me explico con un simple ejemplo. Si queremos las cifras del resultado de 3 * 5 sin hacerlo podemos aplicar la propiedad de que el logaritmo de un producto es la suma de los logaritmos y, si estamos trabajando con enteros, el resultado sería:

Código (cpp) [Seleccionar]
digitos ( 3 * 5) =  log10 ( 3 * 5 ) = log10 (3) + log10 (5) + 1  = 0 + 0 + 1 = 1

Seguro que obtienes uno ?... el seguimiento que realizas al proceso es equivocado, la multiplicación de 3 * 5 es realizada previamente y el resultado es recibido por la función para calcular el logaritmo del mismo.

Código (cpp) [Seleccionar]
digitos ( 3 * 5 ) =  log10 ( 3 * 5 ) = log10 ( 15 ) =  1.17 + 1  = 2

Aprovecho la ocasión para exponer otra opción, pero esta vez usando la función estándar snprintf:

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", numero);

Saludos

leosansan

Cita de: Blaster en  4 Agosto 2014, 01:22 AM
Seguro que obtienes uno ?... el seguimiento que realizas al proceso es equivocado, la multiplicación de 3 * 5 es realizada previamente y el resultado es recibido por la función para calcular el logaritmo del mismo.

Código (cpp) [Seleccionar]
digitos ( 3 * 5 ) =  log10 ( 3 * 5 ) = log10 ( 15 ) =  1.17 + 1  = 2


Creo que no has entendido mi exposición. Aclaro lo que decía.

En el caso de que en lugar de realizar la operación de 3 *5 apliques a la misma logaritmos, es decir :

Código (cpp) [Seleccionar]
log10 ( 3 *  5 ) = log10 (3) + log10 (5) = 0 + 0

es cuando se llegaría a un resultado incoherente si se trabaja con enteros en lugar de flotantes.

Para el caso del factorial que exponía, como no vamos a calcularlo directamente, haríamos:

Código (cpp) [Seleccionar]
log10(1500!) =  log10(1500) + log10(1499) +...+.log10(3) + log10(2)

Y si no tenemos en cuenta el trabajar con floats daría un resultado erróneo, toda vez  que en enteros  sería:

Código (cpp) [Seleccionar]
.....log10(8) + log10(9) = 0

Cuando en realidad deberían dar:

Código (cpp) [Seleccionar]
.....log10(8) + log10(9)= 1.85...==> 1

Y así sucesivamente.

Conste que era sólo una observación, no pretendía en ningún momento hacer crítica a tu comentario.  ;)


¡¡¡¡ Saluditos! ..... !!!!







Blaster

Cita de: leosansan en  4 Agosto 2014, 04:03 AM
Creo que no has entendido mi exposición. Aclaro lo que decía.

Es verdad, debí leer mas detenidamente la explicación que diste

Saludos leosansan

leosansan

Cita de: Blaster en  4 Agosto 2014, 01:22 AM

Aprovecho la ocasión para exponer otra opción, pero esta vez usando la función estándar snprintf:

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", numero);


El problema es que, a diferencia de los dos métodos anteriores, éste que propones da el número de los caracteres de la cadena "numero":

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", "123.314");

y si esta es "123.314" dará 7 mientras que si número se coloca directamente:

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", 123.314);

dará el resultado correcto, "creo", si es un entero e impredecible si es un decimal, aún poniendo %f.

Cita de: Blaster en  4 Agosto 2014, 04:59 AM
Es verdad, debí leer mas detenidamente la explicación que diste

Me alegra que hallas captado lo que pretendía exponer y siento no haber sido tan claro la primera vez.  ;)

Un fuerte saludo Blaster.


Blaster

Cita de: leosansan en  4 Agosto 2014, 06:39 AM
El problema es que, a diferencia de los dos métodos anteriores, éste que propones da el número de los caracteres de la cadena "numero":

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", "123.314");

y si esta es "123.314" dará 7 mientras que si número se coloca directamente:

Código (cpp) [Seleccionar]
int digito = snprintf(NULL, 0, "%d", 123.314);

dará el resultado correcto, "creo", si es un entero e impredecible si es un decimal, aún poniendo %f.

La verdad no lo he probado con números decimales, pero con enteros predecibles si va bien, creo que con eso es suficiente para kutcher según la pregunta inicial

Saludos

leosansan

#15


¡Vamos a darle trabajo a eferion!.



El for no salió tan mal parado, pero ¿lo podemos mejorar?.

Pues se me ha ocurrido un sistema que reduce el número de divisiones a la mitad o a la mitad más uno, según que el número de cifras sea par o impar, con lo que los resultados del test que le pasaste al for tendrás que "actualizarlo" con el nuevo sistema:

Código (cpp) [Seleccionar]
 int digitos = 0 , num = 123456.345 ;
 while ( num )
   digitos = ( num /= 100 ) >= 0 ? digitos + 2 :  digitos + 1 ;





;) ;) Y sirve tanto para enteros como para decimales.  ;) ;)



¡¡¡¡ Saluditos! ..... !!!!