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. Los campos obligatorios están marcados con *