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.
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.
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
Ver comentarios
Muchas gracias!, me ha servido mucho