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.
Deja una respuesta