Introducción
Comenzaremos resolviendo el algoritmo para determinar si un número es narcisista en CPP o C++. Escribiremos una función que recibe un entero y regresa un booleano indicando si el número recibido es narcisista.
Nota: si quieres saber qué es un número narcisista, así como el algoritmo para determinarlo lee: Solución al algoritmo de número narcisista en muchos lenguajes de programación.
Número narcisista en C++
La función que dije queda escrita así:
bool esNarcisista(int numero){
// Nota: to_string pertenece a std, la llamada normal sería std::to_string
string numeroComoCadena = to_string(numero);
double longitudDelNumero = numeroComoCadena.size();
double suma = 0;
// Recorrer cadena, carácter por carácter
for(int indice = 0; indice < longitudDelNumero; indice++){
//Convertir el carácter a entero
double cifraActual = numeroComoCadena[indice] - '0';
// Elevarlo a la potencia dada por la longitud
double 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 true;
}else{
return false;
}
}
Hay algunas cosas importantes que notar. Por ejemplo, para convertir el número a cadena usamos std::to_string
.
Más tarde recorremos el número como si fuera una cadena, y vamos tomando carácter por carácter. Ese carácter es de tipo char, lo convertimos a entero y luego lo elevamos a la potencia N.
¿Y cuál es la potencia N? bueno, N es la longitud del número; es decir, el número de cifras que tiene.
Para elevarlo usamos la función pow en CPP.
Ejemplo completo
Para ver cómo podemos llamar a la función desde un programa normal escrito en C++ implementamos este código:
/*
Determinar si un número es narcisista usando C++
parzibyte.me/blog
*/
#include <iostream>
#include <math.h>
using namespace std;
// Prototipo
bool esNarcisista(int numero);
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");
}
}
// función
bool esNarcisista(int numero){
// Nota: to_string pertenece a std, la llamada normal sería std::to_string
string numeroComoCadena = to_string(numero);
double longitudDelNumero = numeroComoCadena.size();
double suma = 0;
// Recorrer cadena, carácter por carácter
for(int indice = 0; indice < longitudDelNumero; indice++){
//Convertir el carácter a entero
double cifraActual = numeroComoCadena[indice] - '0';
// Elevarlo a la potencia dada por la longitud
double 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 true;
}else{
return false;
}
}
Lo que hacemos es definir un arreglo de enteros, recorrerlo e imprimir si son narcisistas o no. La salida es la siguiente, aunque recuerda que puedes compilarlo y probarlo por ti mismo.
Así es como terminamos.
Muchas gracias!, me ha servido mucho
Pingback: Solución a algoritmo para determinar número narcisista en muchos lenguajes - Parzibyte's blog