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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#