Título: Como calcular cuantos dígitos tiene un entero Publicado por: kutcher en 24 Julio 2014, 22:02 pm Buenas, estoy codificando un programa y me urge saber cuantos dígitos tiene un
número que es de tipo int por ejem: 15742 = 5 dígitos 1234 = 4 dígitos 13 = 2 dígitos He probado con sizeof pero no funciona ¿Alguien tiene alguna idea de como hacer esto? Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: ivancea96 en 24 Julio 2014, 22:15 pm sizeof() retorna el tamaño en bytes de una variable.
Ahora al tema, dado que el entero no guarda decimales, simplemente se pierden, puedes dividirlo entre 10 X veces, hasta que sea 0. En ese momento, X será el número de cifras que tendrá. Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: Blaster en 24 Julio 2014, 22:25 pm ¿Alguien tiene alguna idea de como hacer esto? Otra opción seria aplicar el logaritmo (en base 10) al número del que deseas saber las cifras y luego sumarle uno: Log(1)=>0 Log(9)=>0,95 Log(10)=>1 Log(11)=>1,04 Código
En digitos tendrás el número de cifras de num Saludos Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: leosansan en 25 Julio 2014, 00:02 am Buenas, estoy codificando un programa y me urge saber cuantos dígitos tiene un número que es de tipo int ........................... Por ejemplo, como comentó ivancea96: Código
¡¡¡¡ Saluditos! ..... !!!! (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: kutcher en 25 Julio 2014, 00:39 am Gracias a todos por responder, voy aprobar el método que expuso Blaster me llamo la atención ¿nosé si es seguro esto?
Título: Re: Re: Como calcular cuantos dígitos tiene un entero Publicado por: engel lex en 25 Julio 2014, 01:00 am De que es seguro, dará seguramente la respuesta, si tienes dudas al respecto recomiendo revisar los temas de exponencial y logaritmo para resolver dudas puntuales sobre ello :P
Aunque yo preferiría el metodo de leosansan ya aunque es mas largo en códigos es menos exigente en procesasor Título: Re: Re: Como calcular cuantos dígitos tiene un entero Publicado por: Blaster en 25 Julio 2014, 03:11 am ¿nosé si es seguro esto? Es un metodo matemático muy preciso ten por seguro que obtendrás el resultado esperado. Aunque yo preferiría el metodo de leosansan ya aunque es mas largo en códigos es menos exigente en procesasor Lo dudo aunque así fuera la diferencia seria mínima Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: engel lex en 25 Julio 2014, 03:39 am Lo dudo aunque así fuera la diferencia seria mínima bueno, si es para un calculo independiente, efectivamente la diferencia es instrumental, pero para calcularlo múltiples veces, la diferencia de tiempo si es notable, ya que es la diferencia entre un ciclo con una división (operacion matematica simple posible de hacer por el procesador con un solo paso) contra logaritmo (intenta sacarlo solo con suma, resta, división y multiplicación para que veas cuantos pasos toma) de resto, ya es cosa de kutcher que escoja que se le hace más mejor para su programa :P Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: eferion en 25 Julio 2014, 09:32 am ya que es la diferencia entre un ciclo con una división (operacion matematica simple posible de hacer por el procesador con un solo paso) Perdón por la intromisión, pero la división es la operación más costosa con diferencia de las interpretadas como básicas: suma, resta, producto, división. Y cuando digo costosa me refiero en una proporción que puede llegar a ser de 8 a 1. Dicho esto me ha surgido la duda de saber cual era el algoritmo más óptimo... manos a la obra salió algo tal que: Código
¿Qué sucede con los resultados? Son contundentes (aviso, abstenerse personas sensibles): Editado: Estos resultados son con el programa compilado en modo debug... lo siento. Código: Tiempo division: 43.1613s Luego por 5 cabezas de ventaja, la opción del logaritmo es más óptima que la opción de la división. Edito: Para probar opciones menos extremistas, he reducido el número de prueba a uno con 5 dígitos y he ejecutado el programa... los resultados son los siguientes: Editado: Estos resultados son con el programa compilado en modo debug... lo siento. Código: Tiempo division: 19.1429s Se ve por tanto que la opción del logaritmo es estable en el tiempo, mientras que la división, obviamente, ha reducido su tiempo a la mitad ( tiene la mitad de dígitos ). Dicho esto me surgió una nueva duda... log trabaja con "double"... y si la idea es trabajar con números más grandeS?? Un poco de refactorización y listo: Código
Y su correspondiente resultado (ahora sí en modo release): Código
La conclusión final... cada uno que saque las suyas... pero simplificando yo obtengo las siguientes: * El logaritmo es más estable... ideal para tareas de tiempo real. * La división es, de media, más rápida si se trabaja con enteros... el logaritmo es más eficiente con decimales. * Es curioso como se nota la bajada de tiempos de la división en modo release frente a modo debug Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: leosansan en 3 Agosto 2014, 23:46 pm Otra opción seria aplicar el logaritmo (en base 10) al número del que deseas saber las cifras y luego sumarle uno: Log(1)=>0 Log(9)=>0,95 Log(10)=>1 Log(11)=>1,04 Código
En digitos tendrás el número de cifras de num Saludos Sólo una pequeña observación y es la referida a la importancia de trabajar con double si hay operaciones tipo producto o división implicadas. 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
En contra de lo que sabemos, 3 * 5 = 15 que tiene dos cifras. Lo anterior se evita trabajando don double, ya que entonces : Código
y tan sólo hay que tomar la parte entera para obtener el resultado deseado. Código
Parece una nimiedad lo que comento ya que podíamos haber multiplicado previamente y aplicado el log10 en forma entera al resultado de 15. ¿Pero es esto siempre posible?. Pongo un caso práctico: calcular las cifras que tiene 1500!. En este caso no es tan simple obtener el resultado numérico y ojo que no digo que no sea posible hacerlo en C, incluso sin librerías externas, que sí que se puede. Pero como un factorial no es más que un producto se puede calcular la cifra como suma de logaritmos pero en tipo flotante y el resultado final pasarlo a entero obteniendo: Código
Y la suma de los log10 se puede realizar con un simple for: Código
Y conste que empieza el for en 1 innecesariamente ya que su log es cero, por lo que podía haber empezado en 2, pero es por ponerlo "bonito". ;) Como comenté al principio, se trataba de una simple observación en la diferencia, y obligación en según qué casos, de trabajar con enteros o flotantes para no equivocar el resultado del cálculo del número de dígitos. ¡¡¡¡ Saluditos! ..... !!!! (http://st.forocoches.com/foro/images/smilies/simba2.gif) Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: Blaster en 4 Agosto 2014, 01:22 am 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
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
Aprovecho la ocasión para exponer otra opción, pero esta vez usando la función estándar snprintf: Código
Saludos Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: leosansan en 4 Agosto 2014, 04:03 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
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
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
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
Cuando en realidad deberían dar: Código
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! ..... !!!! (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: Blaster en 4 Agosto 2014, 04:59 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 Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: leosansan en 4 Agosto 2014, 06:39 am Aprovecho la ocasión para exponer otra opción, pero esta vez usando la función estándar snprintf: Código
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
y si esta es "123.314" dará 7 mientras que si número se coloca directamente: Código
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. Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: Blaster en 4 Agosto 2014, 15:05 pm 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
y si esta es "123.314" dará 7 mientras que si número se coloca directamente: Código
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 Título: Re: Como calcular cuantos dígitos tiene un entero Publicado por: leosansan en 4 Agosto 2014, 17:22 pm ¡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
;) ;) Y sirve tanto para enteros como para decimales. ;) ;) ¡¡¡¡ Saluditos! ..... !!!! (http://st.forocoches.com/foro/images/smilies/aaaaa.gif) |