C# - Números de Armstrong


Hoje vamos veremos como calcular o número de Armstrong

Sabe o que é um número de Armstrong ?

O conceito da Álgebra para um número de Armstrong diz que um número de Armstrong :

"É um número de n dígitos que é igual a soma de cada um dos seus dígitos elevado a n-ésima potência "

Por exemplo, 153 (n = três dígitos) é igual a 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153

Outros exemplos são:

370=3^3+7^3+0^3   e    371=3^3+7^3+1^3    e      407=4^3+0^3+7^3

Existem 6 números de Armstrong entre 0 e 999.

Eles são: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407

Uma relação mais completa dos número de Armstrong pode ser vista abaixo:

1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153, 4679307774, 32164049650, 32164049651 , etc.

Existem apenas 88 números de Armstrong na base 10, dos quais o maior é :  115.132.219.018.763.992.565.095.597.973.971.522.401 com 39 dígitos.  (http://en.wikipedia.org/wiki/Narcissistic_number )

Nota:   Quando você for tratar números muito grandes você deve estar atento aos limites dos tipos de dados da plataforma .NET. (veja o link : tabela de tipos )

Criando o projeto .NET Core

Vamos criar um projeto .NET Core do tipo Console App(.NET Core) com o nome CSharp_Numeros_Armstrong.

Os namespaces usados no projeto são:

using static System.Console;
using System;

Vamos mostrar 2 formas distintas de tratar com os números de Armstrong:

  1. Calcular os números de Armstrong entre 1 e 999

Defina o método Armstrong999() na classe Program e inclua o código abaixo:

        private static void Armstrong999()
        {
            int a, b, c, d;
            WriteLine("Números de Armstrong entre 1 e 999 \n");
            for (int numero = 1; numero <= 999; numero++)
            {
                a = numero / 100;
                b = (numero - a * 100) / 10;
                c = (numero - a * 100 - b * 10);
                d = a * a * a + b * b * b + c * c * c;
                if (numero == d)
                {
                    WriteLine($"{numero}");
                }
            }
        }

Executando o código acima iremos obter:

  1. Verificar se um número é um número de Armstrong

Vamos incluir uma classe no projeto chamada NumeroArmstrong() com o código abaixo:

namespace CSharp_Numeros_Armstrong
{
    public class NumeroArmstrong
    {
        // Método para calcular a potência de um numero elevado a outro
        int Potencia(int x, long y)
        {
            if (y == 0)
                return 1;
            if (y % 2 == 0)
                return Potencia(x, y / 2) *
                       Potencia(x, y / 2);
            return x * Potencia(x, y / 2) *
                       Potencia(x, y / 2);
        }
        // Método para calcular a ordem do numero
        int Ordem(int x)
        {
            int n = 0;
            while (x != 0)
            {
                n++;
                x = x / 10;
            }
            return n;
        }
        // Verifica se o numero é um Número de Armstrong
        public bool IsArmstrong(int x)
        {
            // chama o método para calcular a ordem do numero
            int ordem = Ordem(x);
            int temp = x, soma = 0;
            while (temp != 0)
            {
                int resto = temp % 10;
                soma = soma + Potencia(resto, ordem);
                temp = temp / 10;
            }
            // a condição foi satisfeita retorna true
            return (soma == x);
        }
    }
}

Nesta classe temos 3 métodos:

  1. Potencia() - Calcula a potência de um número x elevado a num número y;
  2. Ordem - Calcula a ordem do número , que indica quantos algarismos ele possui;
  3. IsArmstrong() - Verifica se o número é um número de Armstrong;

Esses 3 métodos são usados para permitir verificar se um número é ou não é um número de Armstrong.

Agora basta definir o método IsArmstrong() na classe Program incluindo o código abaixo:

        private static void IsArmstrong()
        {
            NumeroArmstrong numArmstrong = new NumeroArmstrong();
            Console.Write("Informe o número inteiro : ");
            int numero = Convert.ToInt32(Console.ReadLine());
            if(numArmstrong.IsArmstrong(numero))
                 WriteLine($"O número {numero}, é um número de Armstrong");
            else
                 WriteLine($"O número {numero}, NÃO é um número de Armstrong");
        }

Executando o código acima iremos obter:

No método Main da classe Program inclua o código:

        static void Main(string[] args)
        {
            Armstrong999();
            IsArmstrong();
            ReadLine();
        }

Neste método estamos invocando os dois métodos. Podemos comentar um e usar o outro e vice-versa.

Pegue o projeto aqui:   CSharp_Numeros_Armstrong.zip

(disse Jesus)"Aquele que tem os meus mandamentos e os guarda esse é o que me ama; e aquele que me ama será amado de meu Pai, e eu o amarei, e me manifestarei a ele."
João 14:21

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti