(4.0 pontos) Um número n com k dígitos é um número de Armstrong se n é igual à soma das k-ésimas potências dos seus dígitos. Assim, para um número n=a b c com 3 dígitos, onde a, b e c são os dígitos de n, temos que n é de Armstrong se e só se n=a^{3}+b^{3}+c^{3}. Por exemplo, 153 é um número de Armstrong, pois 153=1^{3}+5^{3}+3^{3}. Note também que 1634 é um número de Armstrong, pois 1634=1^{4}+6^{4}+3^{4}+4^{4}.
Nesta questão, você escreverá um programa completo que imprime todos os números de Armstrong de k dígitos, onde k é 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 N e devolve o número de dígitos que N tem em base 10 . Por exemplo, para N=1634, sua função deve devolver 4 .
(b) Escreva uma função de protótipo
int power(int b , int e );
que recebe os inteiros b e e com e \geq 0 e devolve b^{e}. Por exemplo, a chamada power (2,3) deve devolver 8 .
(c) Escreva uma função de protótipo
int armstrong(int N);
que recebe um inteiro positivo N e que devolve 1 se N é 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 k da entrada padrão (usando scanf()) e deve imprimir todos os números de Armstrong com k dígitos. Você deve usar a função do item (c), mesmo que você não a tenha feito.
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
\qquad
$\qquad

Passo 1

O enunciado pede que a gente escreva um programa em C que imprime todos os números de Armstrong com exatamente k dígitos, onde k é lido da entrada. Para isso vamos criar quatro partes:
  1. Uma função digits(int N) que conta quantos dígitos N tem em base 10.
  2. Uma função power(int b, int e) que calcula b^e para expoente inteiro não-negativo.
  3. Uma função armstrong(int N) que verifica se N é número de Armstrong usando as duas anteriores.
  4. O main() que lê k, gera todos os números de k dígitos e imprime os que forem de Armstrong.

Passo 2

Escrevemos a função digits(int N). A ideia é dividir N por 10 repetidamente até chegar a zero, contando quantas vezes fazemos isso:
int digits(int N) {
    int count = 0;
    do {
        count++;
        N /= 10;
    } while (N > 0);
    return count;
}

Passo 3

Escrevemos a função power(int b, int e). Como e \ge 0, usamos um laço que multiplica 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 armstrong(int N). Primeiro descobrimos quantos dígitos k tem N. Em seguida extraímos cada dígito usando % 10 e /= 10, somamos cada dígito elevado a k usando power, e comparamos a soma com N:
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 k\). Calculamos o menor número com \(k\) dígitos como \[\text{lower} = \begin{cases} 1, & \text{se }k=1,\\\\ 10^{\,k-1}, & \text{se }k>1, \end{cases}
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 k dígitos.

Exercícios relacionados