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.

  • 🔘 Definição: Para um número de n dígitos, cada dígito é elevado à potência n e os resultados são somados.
  • ☑️ Exemplo prático: 370 é válido porque 3³ mais 7³ mais 0³ resulta exatamente em 370.
  • Digit Extracção: O operador módulo remove o último dígito e a divisão inteira reduz o número a cada iteração.
  • 🧪 Dois programas: Um deles testa um valor fixo de 153, enquanto o outro percorre todos os números de 0 a 999.
  • 🛠️ Limite conhecido: Elevar cada dígito ao cubo só funciona para valores de três dígitos, portanto, intervalos maiores exigem a potência de n.
  • 📊 Complexidade: Ambos os programas são executados em tempo O(d) por número e usam memória extra O(1).

Número de Armstrong em Java programa usando um loop for

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.

  1. Copie a entrada para um arquivo de trabalho. variável assim o valor original se mantém para a comparação final.
  2. Utilize o operador módulo para calcular o último dígito. digit = tempNumber % 10.
  3. Eleve esse dígito à potência da quantidade de dígitos e adicione-o a um total acumulado.
  4. Elimine o último dígito usando a divisão inteira. tempNumber /= 10.
  5. 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.

Perguntas Frequentes

Sim. Elevando cada dígito ao cubo, obtemos 27 mais 343 mais 1, que soma 371, portanto o valor se reproduz. O programa de intervalo acima o imprime junto com 153, 370 e 407.

O nome reflete a própria propriedade: o número é construído inteiramente a partir de seus próprios dígitos, de modo que parece admirar seu próprio reflexo. Ambos os termos descrevem a mesma regra, e a soma das potências dos dígitos às vezes é chamada de invariante digital mais-que-perfeito.

Existem três: 1634, 8208 e 9474. Cada dígito é elevado à quarta potência porque o valor tem quatro dígitos. O código baseado em cubos não consegue detectá-los, razão pela qual o expoente deve seguir a contagem de dígitos.

Um número perfeito é igual à soma de seus divisores próprios, portanto 6 se qualifica por meio de 1 + 2 + 3. Um número de Armstrong é igual à soma de suas potências algébricas. As duas definições não compartilham nenhuma propriedade aritmética e raramente se sobrepõem.

A função `Math.pow()` retorna um valor do tipo `double`, o que exige uma conversão de volta para `int` e aumenta a possibilidade de erros de arredondamento. Para um cubo fixo, a operação `dígito*dígito*dígito` é mais rápida e precisa. `Math.pow()` só se justifica quando o expoente varia de acordo com o número de dígitos.

Sim. Um método auxiliar pode receber o valor de trabalho, somar o último dígito elevado à potência a um acumulador e chamar a si mesmo com o número dividido por 10. A leitura é boa, embora a versão com loop evite os frames de pilha extras.

Assistentes modernos podem produzir uma passagem direta. trace, reformule o loop em linguagem simples e sugira casos extremos, como 0 ou uma entrada negativa. Verifique o trace em comparação com a saída real do console, porque os passo a passo gerados ocasionalmente pulam uma iteração.

Copiloto do GitHub Geralmente, o loop é concluído apenas com o nome do método, mas frequentemente o valor do cubo é definido diretamente no código. Informe a quantidade de dígitos necessária no prompt, compile e teste a sugestão antes de aceitá-la.

Resuma esta postagem com: