Autor Tema: Concepto de número feliz ¿qué es? Comprobar con algoritmo Error en lógica C++  (Leído 2170 veces)

Zephyr

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Hola, estoy tratando de crear un código para comprobar si un número es feliz.

Lo que tiene que hacer el código es comprobar que un numero es feliz, y esto se verifica  si la suma cuadrada sus digitos es igual a 1, y si no es así se prueba con los siguientes obtenidos. Se repite eso 8 veces y si a la octava no salió el número no es feliz

Ejemplo 7**2=49 (eso no es 1 entonces lo repetimos pero con el obtenido)

4**2+9**2=97 (y asi se repite 8 veces)


*Codigo*

Código: [Seleccionar]
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

int main(){
    int Juzgado,Limite=0,Potenciador=0,Respaldo;
    bool bandera;
    cout<< "Ingrese el numero que desea corroborar si es feliz:" <<endl;
    cin>> Juzgado;
   
while (Limite<=8){ //Solo itera 8 veces antes de concluir que es o no es feliz
Respaldo=Juzgado%10; //Extrae el ultimo digito para potenciarlo
          Juzgado=Juzgado/10; //Me recorta el numero
          Potenciador=Potenciador+Respaldo*Respaldo;
         
        if(Potenciador==1){ //Si resulta que potencia en algun punto es 1 manda el mensaje
        bandera=true;
        break;
    }
        if (Limite==8){ //si alacanzo el limite entonces sale del bucle y dice que no es feliz
        bandera=false;
        break;
        }
        if (Juzgado==0){ //Esto ocurre porque si descompuso juzgado y potenciador no es igual a 1 entonces tengo que dar otra vuelta
        Limite=+1;
        Juzgado=Potenciador;
        Potenciador=0;
}
}
if (bandera==true){
cout<<"El numero  es feliz" << endl;
}
if (bandera==false){
cout<<"El numero no es feliz" <<endl;
}
    system("pause");
    return 0;
}
« Última modificación: 18 de Abril 2021, 20:27 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Error en logica C++
« Respuesta #1 en: 06 de Marzo 2021, 01:49 »
 :o 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 sumaCuadrados

Tras 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.

Código: [Seleccionar]
#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;
}

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".