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
digitos = log10(num) + 1
En
digitos tendrás el número de cifras de
numSaludos
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:
digitos ( 3 * 5) = log10 ( 3 * 5 ) = log10 (3) + log10 (5) + 1 = 0 + 0 + 1 = 1
En contra de lo que sabemos, 3 * 5 = 15 que tiene dos cifras. Lo anterior se evita trabajando don double, ya que entonces :
digitos ( 3 * 5) = log10 ( 3 * 5 ) = log10 (3) + log10 (5) + 1 == 2.176091
y tan sólo hay que tomar la parte entera para obtener el resultado deseado.
n_digitos 3 * 5 = 2.176091 ==> de aqui tomamos la parte entera :
n_digitos 3 * 5 = 2
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:
n_digitos [ 1500! ] = 4115.682325
n_digitos [ 1500! ] = 4115 ---> PERFECTO <----
Y la suma de los log10 se puede realizar con un simple for:
#include <stdio.h>
#include <math.h>
#define N 1500
int main( ) {
double n_digitos = 1 ;
int digitos , i ;
for( i = 1 ; i <= N ; i++ )
n_digitos += ( log10 ( i ) ) ;
printf( "n_digitos [ 1500! ] = %lf\n\n" , n_digitos );
digitos = ( int ) n_digitos ;
printf( "n_digitos [ 1500! ] = %d\n\n" , digitos );
return 0;
}
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! ..... !!!!