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#