Autor
|
Tema: Como calcular cuantos dígitos tiene un entero (Leído 7,121 veces)
|
Blaster
Desconectado
Mensajes: 190
|
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: 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. 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: int digito = snprintf(NULL, 0, "%d", numero);
Saludos
|
|
« Última modificación: 4 Agosto 2014, 03:42 am por Blaster »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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. 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 : 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: 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: .....log10(8) + log10(9) = 0
Cuando en realidad deberían dar: .....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! ..... !!!!
|
|
|
En línea
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Aprovecho la ocasión para exponer otra opción, pero esta vez usando la función estándar snprintf: 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": int digito = snprintf(NULL, 0, "%d", "123.314");
y si esta es "123.314" dará 7 mientras que si número se coloca directamente: 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. 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.
|
|
|
En línea
|
|
|
|
Blaster
Desconectado
Mensajes: 190
|
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": int digito = snprintf(NULL, 0, "%d", "123.314");
y si esta es "123.314" dará 7 mientras que si número se coloca directamente: 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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
¡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: int digitos = 0 , num = 123456.345 ; while ( num ) digitos = ( num /= 100 ) >= 0 ? digitos + 2 : digitos + 1 ;
¡¡¡¡ Saluditos! ..... !!!!
|
|
« Última modificación: 4 Agosto 2014, 17:32 pm por leosansan »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
necesito saber como ingresar 1 nº entero >0 y <=100 luego contar sus digitos....
« 1 2 »
Ejercicios
|
dpunisher03
|
18
|
17,118
|
28 Mayo 2009, 08:24 am
por Eliptico
|
|
|
Como saber cuantos Km tiene de alcance una antena WiFi ?
Materiales y equipos
|
Dark Knight
|
4
|
25,427
|
22 Octubre 2008, 23:21 pm
por Dark Knight
|
|
|
Cuantos años tiene su cerebro.?
« 1 2 3 4 »
Foro Libre
|
Nirvanareus
|
35
|
17,574
|
4 Diciembre 2010, 10:11 am
por flacc
|
|
|
cuantos años tiene eso web?
Foro Libre
|
ami89
|
4
|
3,696
|
27 Junio 2010, 22:31 pm
por [Decoded]
|
|
|
Como cuento cuantos numeros tiene un archivo en (C)
Programación C/C++
|
andie13
|
3
|
2,978
|
16 Noviembre 2016, 20:10 pm
por MRx86
|
|