Numero feliz en Java

Hola a todos, hoy os voy a explicar como podemos indicar que un número es feliz en Java.

Los números felices se calculan reemplazando el número por la suma de los cuadrados de sus dígitos y se repite el proceso hasta que el número es igual a 1 o hasta que se entra en un bucle que no incluye el 1.

Los números que al finalizar el proceso terminan con 1 son conocidos como números felices.

Por ejemplo, 7 es un número feliz, ya que:

72 = 49
42 + 92 = 97
92 + 72 = 130
12 + 32 + 02 = 10
12 + 02 = 1

Primero, pedimos un número positivo.


import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

    }

}


Creamos un hashset para saber si hay alguno numero que se repita durante el proceso.



import java.util.HashSet;
import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

        // Creamos un hashset para comprobar repetidos
        HashSet<Integer> numeros = new HashSet<>();
    
    }

}

Colocaremos un while para que mientras sea el numero diferente de 1 y no se repita, se repetirá. Obtenemos los dígitos del numero.


import java.util.HashSet;
import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

        // Creamos un hashset para comprobar repetidos
        HashSet<Integer> numeros = new HashSet<>();
        boolean repetido = false;

        // Hasta que el numero sea distinto de 1 y no este repetido
        while (numero != 1 && !repetido) {

            // Obtenemos los digitos
            int[] digitos = devuelveDigitos(numero);

        }

    }

    public static int[] devuelveDigitos(int numero) {

        // Si el numero es 0
        // Creamos un array de una posicion
        if (numero == 0) {
            int digitos[] = {0};
            return digitos;
        }

        // Creamos un array con tantas posiciones como cifras tiene el numero
        int digitos[] = new int[cuentaCifras(numero)];
        int digito;
        // Pasamos el numero a positivo
        int numeroOriginal = Math.abs(numero);
        for (int i = 0, j = digitos.length - 1, copiaNumero = numeroOriginal; numeroOriginal > 0; i++, j--) {
            // Divimos la copia entre 10
            copiaNumero /= 10;
            // Obtenemos el digito, numero original menos la copia multiplicada por 10
            digito = numeroOriginal - (copiaNumero * 10);
            // guardamos el digito en el array
            digitos[j] = digito;
            // Actualizamos el numero original
            numeroOriginal = copiaNumero;
        }
        return digitos;
    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        // Si el numero es 0, tiene una cifra
        if (num == 0) {
            contador = 1;
        } else {
            // Vamos dividiendo entre 10 hasta que lleguemos a 0
            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

}


Tenemos un tutorial donde explico como obtener los dígitos de un numero.

https://www.discoduroderoer.es/obtener-todos-los-digitos-de-un-numero-en-java

Recorremos los dígitos y calculamos la suma de ellos elevándolos al cuadrado.


import java.util.HashSet;
import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

        // Creamos un hashset para comprobar repetidos
        HashSet<Integer> numeros = new HashSet<>();
        boolean repetido = false;

        // Hasta que el numero sea distinto de 1 y no este repetido
        while (numero != 1 && !repetido) {

            // Obtenemos los digitos
            int[] digitos = devuelveDigitos(numero);

            // Sumamos los digitos elevandolos al cuadrado
            int suma = 0;
            for (int i = 0; i < digitos.length; i++) {
                suma += Math.pow(digitos[i], 2);
            }

        }

    }

    public static int[] devuelveDigitos(int numero) {

        // Si el numero es 0
        // Creamos un array de una posicion
        if (numero == 0) {
            int digitos[] = {0};
            return digitos;
        }

        // Creamos un array con tantas posiciones como cifras tiene el numero
        int digitos[] = new int[cuentaCifras(numero)];
        int digito;
        // Pasamos el numero a positivo
        int numeroOriginal = Math.abs(numero);
        for (int i = 0, j = digitos.length - 1, copiaNumero = numeroOriginal; numeroOriginal > 0; i++, j--) {
            // Divimos la copia entre 10
            copiaNumero /= 10;
            // Obtenemos el digito, numero original menos la copia multiplicada por 10
            digito = numeroOriginal - (copiaNumero * 10);
            // guardamos el digito en el array
            digitos[j] = digito;
            // Actualizamos el numero original
            numeroOriginal = copiaNumero;
        }
        return digitos;
    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        // Si el numero es 0, tiene una cifra
        if (num == 0) {
            contador = 1;
        } else {
            // Vamos dividiendo entre 10 hasta que lleguemos a 0
            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

}


Añadimos el numero al hashset, si este esta repetido, lo marcamos como tal.


import java.util.HashSet;
import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

        // Creamos un hashset para comprobar repetidos
        HashSet<Integer> numeros = new HashSet<>();
        boolean repetido = false;

        // Hasta que el numero sea distinto de 1 y no este repetido
        while (numero != 1 && !repetido) {

            // Obtenemos los digitos
            int[] digitos = devuelveDigitos(numero);

            // Sumamos los digitos elevandolos al cuadrado
            int suma = 0;
            for (int i = 0; i < digitos.length; i++) {
                suma += Math.pow(digitos[i], 2);
            }

            // Si esta repetido, lo marcamos
            if (!numeros.add(numero)) {
                repetido = true;
            }

        }

    }

    public static int[] devuelveDigitos(int numero) {

        // Si el numero es 0
        // Creamos un array de una posicion
        if (numero == 0) {
            int digitos[] = {0};
            return digitos;
        }

        // Creamos un array con tantas posiciones como cifras tiene el numero
        int digitos[] = new int[cuentaCifras(numero)];
        int digito;
        // Pasamos el numero a positivo
        int numeroOriginal = Math.abs(numero);
        for (int i = 0, j = digitos.length - 1, copiaNumero = numeroOriginal; numeroOriginal > 0; i++, j--) {
            // Divimos la copia entre 10
            copiaNumero /= 10;
            // Obtenemos el digito, numero original menos la copia multiplicada por 10
            digito = numeroOriginal - (copiaNumero * 10);
            // guardamos el digito en el array
            digitos[j] = digito;
            // Actualizamos el numero original
            numeroOriginal = copiaNumero;
        }
        return digitos;
    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        // Si el numero es 0, tiene una cifra
        if (num == 0) {
            contador = 1;
        } else {
            // Vamos dividiendo entre 10 hasta que lleguemos a 0
            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

}

Actualizamos el nuevo número con la suma que hemos calculado.


import java.util.HashSet;
import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

        // Creamos un hashset para comprobar repetidos
        HashSet<Integer> numeros = new HashSet<>();
        boolean repetido = false;

        // Hasta que el numero sea distinto de 1 y no este repetido
        while (numero != 1 && !repetido) {

            // Obtenemos los digitos
            int[] digitos = devuelveDigitos(numero);

            // Sumamos los digitos elevandolos al cuadrado
            int suma = 0;
            for (int i = 0; i < digitos.length; i++) {
                suma += Math.pow(digitos[i], 2);
            }

            // Si esta repetido, lo marcamos
            if (!numeros.add(numero)) {
                repetido = true;
            }

            // Actualizamos el numero
            numero = suma;

        }

    }

    public static int[] devuelveDigitos(int numero) {

        // Si el numero es 0
        // Creamos un array de una posicion
        if (numero == 0) {
            int digitos[] = {0};
            return digitos;
        }

        // Creamos un array con tantas posiciones como cifras tiene el numero
        int digitos[] = new int[cuentaCifras(numero)];
        int digito;
        // Pasamos el numero a positivo
        int numeroOriginal = Math.abs(numero);
        for (int i = 0, j = digitos.length - 1, copiaNumero = numeroOriginal; numeroOriginal > 0; i++, j--) {
            // Divimos la copia entre 10
            copiaNumero /= 10;
            // Obtenemos el digito, numero original menos la copia multiplicada por 10
            digito = numeroOriginal - (copiaNumero * 10);
            // guardamos el digito en el array
            digitos[j] = digito;
            // Actualizamos el numero original
            numeroOriginal = copiaNumero;
        }
        return digitos;
    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        // Si el numero es 0, tiene una cifra
        if (num == 0) {
            contador = 1;
        } else {
            // Vamos dividiendo entre 10 hasta que lleguemos a 0
            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

}

Si al acabar el numero es 1, el numero será feliz.


import java.util.HashSet;
import java.util.Scanner;

public class NumeroFeliz {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int numero;
        do {

            System.out.println("Escribe un numero");
            numero = sc.nextInt();

            if (!(numero >= 0)) {
                System.out.println("Debes escribir un numero mayor que 0");
            }

        } while (!(numero >= 0));

        // Creamos un hashset para comprobar repetidos
        HashSet<Integer> numeros = new HashSet<>();
        boolean repetido = false;

        // Hasta que el numero sea distinto de 1 y no este repetido
        while (numero != 1 && !repetido) {

            // Obtenemos los digitos
            int[] digitos = devuelveDigitos(numero);

            // Sumamos los digitos elevandolos al cuadrado
            int suma = 0;
            for (int i = 0; i < digitos.length; i++) {
                suma += Math.pow(digitos[i], 2);
            }

            // Si esta repetido, lo marcamos
            if (!numeros.add(numero)) {
                repetido = true;
            }

            // Actualizamos el numero
            numero = suma;

        }

        // Si el numero es 1, es feliz
        if (numero == 1) {
            System.out.println("El numero es feliz");
        } else {
            System.out.println("El numero no es feliz");
        }

    }

    public static int[] devuelveDigitos(int numero) {

        // Si el numero es 0
        // Creamos un array de una posicion
        if (numero == 0) {
            int digitos[] = {0};
            return digitos;
        }

        // Creamos un array con tantas posiciones como cifras tiene el numero
        int digitos[] = new int[cuentaCifras(numero)];
        int digito;
        // Pasamos el numero a positivo
        int numeroOriginal = Math.abs(numero);
        for (int i = 0, j = digitos.length - 1, copiaNumero = numeroOriginal; numeroOriginal > 0; i++, j--) {
            // Divimos la copia entre 10
            copiaNumero /= 10;
            // Obtenemos el digito, numero original menos la copia multiplicada por 10
            digito = numeroOriginal - (copiaNumero * 10);
            // guardamos el digito en el array
            digitos[j] = digito;
            // Actualizamos el numero original
            numeroOriginal = copiaNumero;
        }
        return digitos;
    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        // Si el numero es 0, tiene una cifra
        if (num == 0) {
            contador = 1;
        } else {
            // Vamos dividiendo entre 10 hasta que lleguemos a 0
            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

}

Veamos unos ejemplos:

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.