Narcisista en C
Después de algún tiempo de haber publicado el algoritmo para saber si un número es narcisista en varios lenguajes de programación es hora de implementarlo en el lenguaje C.
No podemos usar el código de C++ porque C++ no es compatible con C; aunque al revés sí se puede. Es decir, podemos usar código de C en CPP pero no podemos usar código de CPP en C.
En fin, veremos cómo implementar el algoritmo para determinar si un número es narcisista en C.
El algoritmo es el mismo aplicado para todas las demás implementaciones… convertimos el número a cadena, lo recorremos cifra por cifra y vamos elevando cada número. Hay algunas lecturas que te ayudarán a entender mejor todo el algoritmo:
Convertir número a cadena en C
Por cierto, para sacar la longitud de un número pero sin convertirlo a cadena se utiliza el logaritmo en base 10 y luego se redondea hacia abajo; no me preguntes cómo funciona porque no sé, pero te da la longitud del número. Esto no interfiere con el algoritmo, porque al final el fin justifica los medios.
Una vez explicado un poco, vamos allá.
Aquí está sin más vueltas:
int esNarcisista(int numero) {
// Obtener longitud sin convertir a cadena
int longitudDelNumero = floor(log10(numero)) + 1;
// Búfer para alojar cadena
char numeroComoCadena[longitudDelNumero + 1];
// Convertir número a cadena
sprintf(numeroComoCadena, "%d", numero);
int suma = 0;
// Recorrer cadena, carácter por carácter
for (int indice = 0; indice < longitudDelNumero; indice++) {
// Convertir el carácter a entero
int cifraActual = numeroComoCadena[indice] - '0';
// Elevarlo a la potencia dada por la longitud
int elevado = pow(cifraActual, longitudDelNumero);
// Sumar el resultado a suma
suma = suma + elevado;
}
// Si la suma y el número recibido son iguales, es narcisista
if (suma == numero) {
return 1;
} else {
return 0;
}
}
La función recibe un número y devuelve un “booleano” si le queremos llamar así. Es decir, un 1 en caso de que el número sea narcisista y un 0 en caso de que no.
Esta función para saber si un número es narcisista en C utiliza algunas funciones matemáticas; por otro lado, la conversión de entero a cadena también necesita unas funciones. Por ello, debemos incluir stdio.h
y math.h
.
Para llamar a la función aquí dejo un ejemplo:
int main() {
// Algunos números para probar
int numeros[] = {1, 2, 3, 4, 153, 28, 11, 96, 407, 1634, 54748};
for (int x = 0; x < sizeof(numeros) / sizeof(numeros[0]); x++) {
printf("%d es narcisista? %s\n", numeros[x],
esNarcisista(numeros[x]) ? "true" : "false");
}
}
Recorremos un arreglo de números y en cada iteración comprobamos si es narcisista o no; imprimiendo los resultados por pantalla.
Y listo, así de simple es. Igualmente se pueden cambiar los tipos de variables para poder trabajar con números más grandes, pero depende del problema que enfrentemos.
El día de hoy vamos a ver cómo restablecer la impresora térmica GOOJPRT PT-210 a…
Hoy voy a enseñarte cómo imprimir en una impresora térmica conectada por USB a una…
En este post voy a enseñarte a programar un servidor web en Android asegurándonos de…
En este post te quiero compartir un código de C++ para listar y cancelar trabajos…
Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…
Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…
Esta web usa cookies.