Validar numeros Armstrong o narcisistas en Java

Hola a todos, hoy os voy a explicar como validar si un numero es un numero armstrong o narcisista.

Un número armstrong es aquel igual a sus dígitos elevados al número de dígitos, por ejemplo, el 371 es un número armstrong porque 371 = 33 + 73 + 13

Puedes comprobar si un número es armstrong aquí.

Preparando todo lo necesario

En primer lugar, debemos preparar todo lo necesario, en este caso pediremos un número.

Para obtener los dígitos de un número, ya lo hicimos en este tutorial:

Obtener todos los dígitos de un numero en Java

Para la anterior función, necesitamos calcular el número de dígitos, lo hicimos en este tutorial:

Contar el numero de dígitos en Java

package es.discoduroderoer.app;

import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {

        Scanner sn = new Scanner(System.in);

        System.out.println("Escribe un numero");
        int num = sn.nextInt();

    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        if (num == 0) {
            contador = 1;
        } else {

            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

    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;
    }

}

Algoritmo para calcular un número armstrong

Para saber si un número es un número armstrong, obtendremos los digitos del numero que hemos pedido y obtendremos la suma de cada cifra elevada al numero de digitos del numero.

Si la suma final coincide con el número inicial es un número armstrong.

package es.discoduroderoer.app;

import java.util.Scanner;

public class Principal {

    public static void main(String[] args) {

        Scanner sn = new Scanner(System.in);

        System.out.println("Escribe un numero");
        int num = sn.nextInt();
        
        int[] cifras = devuelveDigitos(num);
        int numCifras = cifras.length;
        
        int suma = 0;
        for (int i = 0; i < cifras.length; i++) {
            suma += Math.pow(cifras[i], numCifras);
        }
        
        if(suma == num){
            System.out.println("El número " + num + " es un número armstrong");
        }else{
            System.out.println("El número " + num + " no es un número armstrong");
        }
        

    }

    public static int cuentaCifras(int num) {

        int contador = 0;

        if (num == 0) {
            contador = 1;
        } else {

            for (int i = Math.abs(num); i > 0; i /= 10) {
                contador++;
            }

        }

        return contador;
    }

    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;
    }

}

Resultados

Por último, ya podemos probar nuestro programa.

numeros armstrong java 1

numeros armstrong java 2

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 *