VB .NET - Verificando e encontrando números 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 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 )

Quanto você for tratar números muito grandes você deve estar atento aos limites dos tipos de dados da plataforma .NET :

Bits .NET VB.NET Valor Mínimo Valor Máximo
(1) Boolean   −1 0
8 SByte   −128 127
8 Byte   0 255
16 Int16 Short −32768 32767
16 UInt16 UShort 0 65535
32 Int32 Integer % −2,147,483,648 2,147,483,647
32 UInt32 UInteger 0 4,294,967,295
64     −922,337,203,685,477.5808 922,337,203,685,477.5807
64 Int64 Long & −9,223,372,036,854,775,808 9,223,372,036,854,775,807
64 UInt64 ULong 0 18,446,744,073,709,551,615
128 Decimal @ −7.92E+28 * 7.92E+28 *
32 Single ! −3.4028235E+38 3.4028235E+38
64 Double # −1.79769313486231570E+308 1.79769313486231570E+308
Date and time
64     −657434.999994212936159 2958465.999999999767
64 DateTime Date −9,223,372,036,854,775,808 7,767,064,994,427,387,903
64 TimeSpan   −9,223,372,036,854,775,808 9,223,372,036,854,775,807

Vou criar uma solução no Visual Studio 2012 Express for desktop usando a linguagem VB .NET e mostrar como podemos obter os números de Armstrong.

Criando a solução e os projetos

Vamos criar uma solução e 3 projetos usando a linguagem VB .NET para mostrar como verificar e encontrar números de Armstrong.

Abra Visual Studio 2012 Express for desktop e clique em New Project informando o nome NumerosArmstrong e clique em OK;

Projeto 1_Armstrong

Este projeto utiliza um algoritmo bem simples para verificar se um número informado é um número de Armstrong. Ele serve apenas para números entre 100 e 999.

Se o número for um número de Armstrong ele é exibido no controle ListBox caso contrário será lançada uma exceção personalizada que criaremos no projeto.

Altere o nome do projeto para 1_Armstrong e remova o arquivo App.Config criado no projeto;

No formulário formulário Form1.vb inclua os seguintes controles:

Define os controles no formulário conforme o leiaute da figura abaixo:

A seguir vamos definir um variável numero do tipo Integer no início do formulário:

  Dim numero As Integer

Vamos definir uma exceção personalizada que deriva de Exception chamada ArmstrongException que será lançada quando um número não for de Armstrong:

    'cria a exceção personalizada herdando de Exception
    Public Class ArmstrongException
        Inherits Exception
        Public Sub New()
        End Sub
    End Class

 

No evento Click do botão de comando Verificar temos o código que verificar se o número entre 100 e 999 é um número de Armstrong:

 Private Sub btnVerificaNumeroArmstrong_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
Handles btnVerificaNumeroArmstrong.Click
        Dim a, b, c, soma As Integer
        'converte o valor para numerico
        numero = Val(txtNumero.Text)
        If numero < 100 Or numero > 999 Then
            MessageBox.Show("Numero deve estar entre 100 e 999")
            Return
        End If
        a = numero \ 100 'divide o valor do numero por 100 e toma a parte real
        b = (numero Mod 100) \ 10 'Usa a função mod para remover o primeiro numero e dividir por 10
        c = numero Mod 10 'Pega o último numero usando Mod
        'soma o número elevento aos digitos (no nosso caso apenas 3)
        soma = a * a * a + b * b * b + c * c * c
        'verifica se o numero é de armstrong e lança a exceção se for o caso
        Try
            'se for numero armstrong então inclui no listbox
            If soma = numero Then
                lstArmstrong.Items.Add(numero)
                txtNumero.Clear()
            Else
                'lança exceção
                Throw New ArmstrongException
            End If
        Catch ex As ArmstrongException
            MsgBox("Exceção :: Este número não é um Número de Armstrong", MsgBoxStyle.Critical, "ArmStrongException")
        End Try
    End Sub

 

Abaixo temos o projeto em execução:

Projeto 2_Armstrong

Este projeto utiliza um algoritmo bem simples para verificar se um número informado é um número de Armstrong. Ele serve para verificar qualquer número até 1.79769313486231570E+308 que o máximo valor para um double.

Se o número for um número de Armstrong ele é exibido no controle ListBox caso contrário será lançada uma exceção personalizada que criaremos no projeto.

No menu FILE clique em Add -> New Project selecione o template Visual Basic -> Windows -> Windows Forms Application e informe o nome 2_Armstrong e clique em OK;

Remova o arquivo App.Config criado no projeto;

A seguir inclua a partir da ToolBox os seguintes controles no formulário:

Define os controles no formulário conforme o leiaute abaixo:

Vamos definir uma exceção personalizada que deriva de Exception chamada ArmstrongException que será lançada quando um número não for de Armstrong:

    'cria a exceção personalizada herdando de Exception
    Public Class ArmstrongException
        Inherits Exception
        Public Sub New()
        End Sub
    End Class

Definimos apenas um construtor padrão vazio: Sub New.

No evento Click do botão Verificar temos o código que verifica se o número é um número de Armstrong:

    Private Sub btnVerifica_Click(sender As Object, e As EventArgs) Handles btnVerifica.Click
        Dim numero, soma, temp, resto, nudig As Double
        soma = 0
        Try
            numero = Convert.ToDouble(txtNumero.Text)
            temp = numero
            nudig = contaNumeroDigitos(temp)
        Catch ovex As OverflowException
            MessageBox.Show("Erro de overflow :" + ovex.Message)
            Return
        Catch ex As Exception
            MessageBox.Show("Erro :" + ex.Message)
            Return
        End Try
        While Not (temp = 0)
            resto = temp Mod 10
            soma = soma + Math.Pow(resto, nudig)
            temp = Int(temp / 10)
        End While
        Try
            If (numero = soma) Then
                lstArmstrong.Items.Add(numero)
                txtNumero.Clear()
            Else
                Throw New ArmstrongException()
            End If
        Catch ex As Exception
            MsgBox("Exceção :Este número não é um Número de Armstrong", MsgBoxStyle.Critical, "ArmStrongException")
        End Try

 

Note que temos um método chamado contaNumeroDigitos que retorna o número de dígitos do número informado. Essa informação é usada para verificar se o número é um número de Armstrong. Abaixo vemos o código deste método:

 Private Shared Function contaNumeroDigitos(numero As Integer) As Integer
        Dim numdigitos As Integer = 0
        Do
            numero = numero \ 10
            numdigitos += 1
        Loop While numero > 0
        Return numdigitos
    End Function

Executando um projeto e informando um número válido temos:

Projeto 3_Armstrong

Este projeto calcula os números de Armstrong existentes entre dois números informados exibindo os valores em um ListBox.

No menu FILE clique em Add -> New Project selecione o template Visual Basic -> Windows -> Windows Forms Application e informe o nome 3_Armstrong e clique em OK;

Remova o arquivo App.Config criado no projeto;

A seguir inclua a partir da ToolBox os seguintes controles no formulário:

Define os controles no formulário conforme o leiaute abaixo:

No evento Click do botão btnVerificaNumeros temos o código que verifica se o número é válido e o exibe no ListBox até o limite máximo informado:

 Private Sub btnVerificaNumeros_Click(sender As Object, e As EventArgs) Handles btnVerificaNumeros.Click
        Dim resto, soma, tmp, max, min, nudig As Double
        Dim conta As Integer = 0
        min = Convert.ToDouble(txtMinimo.Text)
        max = Convert.ToDouble(txtMaximo.Text)

        'Percorre os números no intervalo informado
        While min <= max
            'atribui o valor mínimo a varival tmp
            tmp = min
            soma = 0
            'obtem o número de digitos do numero
            nudig = contaNumeroDigitos(tmp)
            'calcula enquanto o numero temp vor diferente de zero
            While tmp <> 0
                resto = tmp Mod 10
                soma += Math.Pow(resto, nudig)
                tmp = tmp \ 10
            End While
            'se o numero é válido então inclui no listbox e incrementa o contador
            If soma = min Then
                lstArmstrong.Items.Add(min)
                conta += 1
            End If
            min += 1
        End While
        lblmsg.Text = conta.ToString & " números encontrados."
        MessageBox.Show("Operação concluída...")
    End Sub

Esta rotina também usa do método contaNumeroDigitos cujo código vemos abaixo:

 Private Shared Function contaNumeroDigitos(numero As Integer) As Integer
        Dim numdigitos As Integer = 0
        Do
            numero = numero \ 10
            numdigitos += 1
        Loop While numero > 0
        Return numdigitos
    End Function

Executando o projeto para um intervalo de 0 a 100000 temos o resultado abaixo:

Pegue o projeto completo aqui: NumerosArmstrongVBNET.zip

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

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# 2013 com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

Mat 6:1 Guardai-vos de fazer as vossas boas obras diante dos homens, para serdes vistos por eles; de outra sorte não tereis recompensa junto de vosso Pai, que está nos céus.

Mat 6:2 Quando, pois, deres esmola, não faças tocar trombeta diante de ti, como fazem os hipócritas nas sinagogas e nas ruas, para serem glorificados pelos homens. Em verdade vos digo que já receberam a sua recompensa.

Mat 6:3 Mas, quando tu deres esmola, não saiba a tua mão esquerda o que faz a direita;

Mat 6:4 para que a tua esmola fique em secreto; e teu Pai, que vê em secreto, te recompensará.

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti