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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 } } |
Colocaremos un while para que mientras sea el numero diferente de 1 y no se repita, se repetirá. Obtenemos los dígitos del numero.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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 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://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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
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 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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
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 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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
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 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.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
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 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.
Deja una respuesta