Número Armstrong no programa JAVA usando For Loop
⚡ Resumo Inteligente
Os números de Armstrong são iguais à soma de seus próprios dígitos elevados à potência da quantidade de dígitos, e os dois Java Os programas abaixo verificam um único valor e listam todos os números de Armstrong menores que mil.
O que é o número Armstrong?
Em um número Armstrong, a soma das potências dos dígitos individuais é igual ao próprio número.
Em outras palavras, a seguinte equação será verdadeira
xy..z = xn + yn+.....+ zn
n é o número de dígitos do número
Por exemplo, este é um número Armstrong de 3 dígitos
370 = 33 + 73 + 03 = 27 + 343 + 0 = 370
Exemplos de Armstrong Numbers
0, 1, 4, 5, 9, 153, 371, 407, 8208, etc.
Todo valor de um dígito de 0 a 9 satisfaz a regra trivialmente, pois um número de um dígito elevado à potência um resulta em si mesmo. O conjunto completo dos números de Armstrong de três dígitos é 153, 370, 371 e 407, enquanto 1634, 8208 e 9474 são os membros de quatro dígitos. Os matemáticos também chamam esses valores de números narcisistas, já que cada um se reproduz a partir de seus próprios dígitos.
Vamos escrever isso em um programa:
Como funciona o algoritmo do número de Armstrong
Antes de ler o código, é útil observar a aritmética que ambos os programas repetem. A verificação requer apenas três operações: remover o último dígito, elevá-lo à potência necessária e reduzir o número em uma casa decimal.
- Copie a entrada para um arquivo de trabalho. variável assim o valor original se mantém para a comparação final.
- Utilize o operador módulo para calcular o último dígito.
digit = tempNumber % 10. - Eleve esse dígito à potência da quantidade de dígitos e adicione-o a um total acumulado.
- Elimine o último dígito usando a divisão inteira.
tempNumber /= 10. - Repita o processo até que a variável de trabalho chegue a 0 e, em seguida, compare o total acumulado com o número original.
Executar esses passos 153 vezes produz o seguinte: trace abaixo. Cada valor na tabela é impresso pelo primeiro programa, então a saída pode ser comparada linha por linha enquanto se aprende o loop.
| Passar | Número temporário | dígito | soma do cubo dos dígitos |
| 1 | 153 | 3 | 27 |
| 2 | 15 | 5 | 152 |
| 3 | 1 | 1 | 153 |
| saída | 0 | - | 153 é igual a 153, portanto 153 é um número de Armstrong. |
Uma limitação importante. Ambos os programas multiplicam o dígito por si mesmo três vezes, que é a potência correta apenas quando a entrada tem exatamente três dígitos. A regra geral eleva cada dígito à potência n, onde n é o número de dígitos; portanto, um valor de quatro dígitos, como 8208, precisa de uma quarta potência e seria ignorado pelo código baseado em cubos. Contar os dígitos primeiro e elevar cada um a essa potência é o que transforma a rotina em um teste geral.
Com a aritmética esclarecida, o primeiro programa a aplica a um único valor predefinido.
Java Programa para verificar se um número é um número Armstrong
A classe abaixo armazena o candidato em inputArmstrongNumber e imprime as variáveis de trabalho a cada iteração, o que torna o Java Loop fácil de seguir em um console.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int inputArmstrongNumber = 153; //Input number to check armstrong int tempNumber, digit, digitCubeSum = 0; tempNumber = inputArmstrongNumber; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ System.out.println("Current Number is "+tempNumber); digit =tempNumber % 10; System.out.println("Current Digit is "+digit); //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit*digit*digit; System.out.println("Current digitCubeSum is "+digitCubeSum); tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if(digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); else System.out.println(inputArmstrongNumber + " is not an Armstrong Number"); } }
Compile e execute a classe a partir da raiz do projeto. Porque o arquivo declara package com.guru99, deve estar em um local correspondente com/guru99 pasta, ou o tempo de execução relata um erro de classe não encontrada. Alterar o valor em inputArmstrongNumber A linha é tudo o que é necessário para testar outro candidato.
saída
Current Number is 153 Current Digit is 3 Current digitCubeSum is 27 Current Number is 15 Current Digit is 5 Current digitCubeSum is 152 Current Number is 1 Current Digit is 1 Current digitCubeSum is 153 153 is an Armstrong Number
Verificar um valor de cada vez é útil para tracmas a mesma lógica se aplica a toda uma gama por meio de encapsulamentoping está em um loop externo.
Java Programa para imprimir números de Armstrong de 0 a 999
A segunda versão mantém o mesmo interior. while loop e adiciona um for laço que percorre o intervalo. Observe que digitCubeSum é zerado no início de cada iteração, um detalhe que a maioria dos iniciantes esquece.
//ChecktempNumber is Armstrong or not using while loop package com.guru99; public class ArmstrongNumber { public static void main(String[] args) { int tempNumber, digit, digitCubeSum; for (int inputArmstrongNumber = 0; inputArmstrongNumber < 1000; inputArmstrongNumber++) { tempNumber = inputArmstrongNumber; digitCubeSum = 0; while (tempNumber != 0) { /* On each iteration, remainder is powered by thetempNumber of digits n */ digit = tempNumber % 10; //sum of cubes of each digits is equal to thetempNumber itself digitCubeSum = digitCubeSum + digit * digit * digit; tempNumber /= 10; } //check giventempNumber and digitCubeSum is equal to or not if (digitCubeSum == inputArmstrongNumber) System.out.println(inputArmstrongNumber + " is an Armstrong Number"); } } }
saída
0 is an Armstrong Number 1 is an Armstrong Number 153 is an Armstrong Number 370 is an Armstrong Number 371 is an Armstrong Number 407 is an Armstrong Number
A listagem para em 1 em vez de continuar até 9 porque o cubo de um único dígito só corresponde ao próprio dígito para 0 e 1. Elevar cada dígito à potência da quantidade de dígitos retornaria todos os dez valores de um único dígito, o que é a mesma generalização descrita anteriormente.
Ambas as listagens são curtas o suficiente para serem usadas como referência, portanto, vale a pena declarar explicitamente o custo dessa abordagem.
Complexidade Temporal e Espacial do Programa de Números de Armstrong
O laço interno divide a variável de trabalho por 10 a cada iteração, executando-se uma vez por dígito em vez de uma vez por unidade do número. Isso torna a verificação de valor único extremamente barata, e essa eficiência se mantém mesmo com o aumento do número de entradas.
| Programa | Complexidade do tempo | Complexidade do espaço |
| Selecione um número | O(d), onde d é a contagem de dígitos. | O (1) |
| Analise uma sequência de N números. | O(N × d) | O (1) |
Porque d é igual a log10(número) arredondado para cima, a verificação única é efetivamente logarítmica no valor que está sendo testado. Apenas três int As variáveis nunca são alocadas e nenhum array ou coleção é criado, razão pela qual o custo de espaço permanece constante, independentemente do tamanho do intervalo.
Duas observações práticas decorrem disso. Primeiro, a varredura de intervalo é dominada por N, portanto, imprimir números de Armstrong até um milhão custa aproximadamente mil vezes mais do que imprimi-los até mil. Segundo, um int Os limites ultrapassam 2,147,483,647, portanto, uma busca em intervalos muito grandes precisa de long tanto para o candidato quanto para a soma acumulada. O mesmo dígito-extracO padrão de ação aparece em muitos exercícios para iniciantes, incluindo o verificação de número primo, Série Fibonacci exercícios de programação e em matriz, como Tipo de bolha e tipo de inserção.
