
Uooo, nunca había oído hablar de los números "felices".
Creo que el principal fallo de tu lógica está en la descomposición del número para sumar el cuadrado de sus cifras.
En cada iteración, solo descompones una vez, es decir, solo extraes una cifra.
Pero tendrías que descomponer tantas veces como cifras tenga el número que se está evaluando.
Para esto se requiere un segundo bucle while anidado dentro del while principal.
En este bucle vamos descomponiendo la variable
respaldo hasta que obtenga valor 0, es decir, ya no quedan cifras.
En cada "descomposición", la cifra obtenida hacemos el cuadrado y vamos acumulando las sumas con otros cuadrados en otra variable, que podemos llamara
sumaCuadradosTras terminar de descomponer, comprobamos si
sumaCuadrados es igual a 1, en cuyo caso el número evaluado es feliz.
Si no es 1, repetimos proceso, pasando el valor de
sumaCuadrados a
respaldo para que en la siguiente iteración, volvamos de nuevo a descomponerlo hasta que valga 0.
Todo esto se repite un máximo de 8 veces y mientras no se certifique que el número es feliz.
He escrito el siguiente código siguiendo estos pasos, y parece funcionar. He buscado una lista de números felices y los que he comprobado son reconocidos como tal.
Espero que te sirva. Cualquier duda pregunta lo que sea.
Un saludo.
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int main() {
int numero, respaldo, iteraciones = 0;
bool esFeliz = false;
cout << "Ingrese el numero que desea corroborar si es feliz:" << endl;
cin >> numero;
respaldo = numero;
while (iteraciones <= 8 && !esFeliz)
{
int sumaCuadrados = 0;
//Descomponemos número para separar sus cifras y sumar sus cuadrados
while (respaldo > 0) //Esto se repite hasta que ya no queden cifras para descomponer
{
int cifra = respaldo % 10;
sumaCuadrados += cifra * cifra;
respaldo = respaldo / 10;
}
//Comprobamos suma de cuadrados
if (sumaCuadrados == 1)
esFeliz = true; //Bucle terminará
else //Hay que intentar de nuevo con la suma de cuadrados obtenida
{
respaldo = sumaCuadrados;
iteraciones++;
}
}
if (esFeliz)
cout << numero << " es un numero feliz :)" << endl;
else
cout << numero << " es un numero triste :( " << endl;
system("pause");
return 0;
}