(4.0 pontos) Um número
com
dígitos é um número de Armstrong se
é igual à soma das
-ésimas potências dos seus dígitos. Assim, para um número
com 3 dígitos, onde
e
são os dígitos de
, temos que
é de Armstrong se e só se
. Por exemplo, 153 é um número de Armstrong, pois
. Note também que 1634 é um número de Armstrong, pois
.
Nesta questão, você escreverá um programa completo que imprime todos os números de Armstrong de
dígitos, onde
é dado pelo usuário. Para tanto, resolva cada um dos itens abaixo, separadamente. Quando você tiver feito todos os itens, seu programa estará completo.
(a) Escreva uma função de protótipo
int digits(int N );
que recebe um inteiro positivo
e devolve o número de dígitos que
tem em base 10 . Por exemplo, para
, sua função deve devolver 4 .
(b) Escreva uma função de protótipo
int power(int b , int e );
que recebe os inteiros
e
com
e devolve
. Por exemplo, a chamada power
deve devolver 8 .
(c) Escreva uma função de protótipo
int armstrong(int N);
que recebe um inteiro positivo
e que devolve 1 se
é um número de Armstrong e devolve 0 caso contrário. Sua função deve usar as funções dos itens (a) e (b), mesmo que você não as tenha feito.
(d) Escreva o main() de seu programa: seu main() deve ler um inteiro positivo
da entrada padrão (usando scanf()) e deve imprimir todos os números de Armstrong com
dígitos. Você deve usar a função do item (c), mesmo que você não a tenha feito.
$\qquad
Nesta questão, você escreverá um programa completo que imprime todos os números de Armstrong de
(a) Escreva uma função de protótipo
int digits(int N );
que recebe um inteiro positivo
(b) Escreva uma função de protótipo
int power(int b , int e );
que recebe os inteiros
(c) Escreva uma função de protótipo
int armstrong(int N);
que recebe um inteiro positivo
(d) Escreva o main() de seu programa: seu main() deve ler um inteiro positivo
$\qquad
Passo 1
O enunciado pede que a gente escreva um programa em C que imprime todos os números de Armstrong com exatamente
dígitos, onde
é lido da entrada. Para isso vamos criar quatro partes:
- Uma função
digits(int N)
que conta quantos dígitostem em base 10. - Uma função
power(int b, int e)
que calculapara expoente inteiro não-negativo. - Uma função
armstrong(int N)
que verifica seé número de Armstrong usando as duas anteriores. - O
main()
que lê, gera todos os números de dígitos e imprime os que forem de Armstrong.
Passo 2
Escrevemos a função por 10 repetidamente até chegar a zero, contando quantas vezes fazemos isso:
digits(int N)
. A ideia é dividir
int digits(int N) {
int count = 0;
do {
count++;
N /= 10;
} while (N > 0);
return count;
}
Passo 3
Escrevemos a função , usamos um laço que multiplica
power(int b, int e)
. Como
b
por si mesmo e
vezes:int power(int b, int e) {
int result = 1;
for (int i = 0; i < e; i++) {
result *= b;
}
return result;
}
Passo 4
Escrevemos tem
. Em seguida extraímos cada dígito usando usando :
armstrong(int N)
. Primeiro descobrimos quantos dígitos
% 10
e /= 10
, somamos cada dígito elevado a
power
, e comparamos a soma com
int armstrong(int N) {
int k = digits(N);
int original = N;
int sum = 0;
while (N > 0) {
int d = N % 10;
sum += power(d, k);
N /= 10;
}
return (sum == original);
}
Passo 5
No
main()
, lemos o inteiro positivo
e o maior como (upper = 10^k - 1]. Iteramos de
lower
até upper
e imprimimos N
sempre que armstrong(N)
for verdadeiro:#include <stdio.h>
int digits(int N) {
int count = 0;
do {
count++;
N /= 10;
} while (N > 0);
return count;
}
int power(int b, int e) {
int result = 1;
for (int i = 0; i < e; i++) {
result *= b;
}
return result;
}
int armstrong(int N) {
int k = digits(N);
int original = N;
int sum = 0;
while (N > 0) {
int d = N % 10;
sum += power(d, k);
N /= 10;
}
return (sum == original);
}
int main() {
int k;
if (scanf("%d", &k) != 1 || k <= 0) return 0;
int lower = (k == 1 ? 1 : power(10, k - 1));
int upper = power(10, k) - 1;
for (int N = lower; N <= upper; N++) {
if (armstrong(N)) {
printf("%d\n", N);
}
}
return 0;
}
Resposta
O programa acima está completo e imprime todos os números de Armstrong com exatamente
dígitos.