Online C Compiler
Abrir no compilador

Edição didática em português. O código e suas saídas preservam o original.

Exercícios de laços: dígitos, inversão e primalidade

Some os dígitos de um inteiro, inverta sua ordem e classifique o número invertido.

Abrir no compilador

Exercícios de laços: dígitos, inversão e primalidade
Some os dígitos de um inteiro, inverta sua ordem e classifique o número invertido.

Leia um inteiro positivo N. Calcule a soma de seus dígitos e construa o inteiro invertido com operações aritméticas, sem convertê-lo em string. Classifique o resultado como primo, composto ou nenhum dos dois se for menor ou igual a um.

Imprima exatamente três linhas com os rótulos Digit Sum:, Reversed: e Status:. Os estados possíveis são Prime, Composite e Neither. Preserve essas palavras em inglês: elas fazem parte do contrato de saída e dos testes.

Entrada

Um inteiro positivo N.

Saída

Digit Sum: <soma>
Reversed: <invertido>
Status: <Prime|Composite|Neither>

Restrições

  • 1 <= N <= 1.000.000.000
  • Tempo: 1 segundo. Memória: 64 MB.
  • Use um tipo suficientemente largo para o inteiro invertido.
Dicas
  • Obtenha o último dígito com % 10 e remova-o com / 10.
  • Atualize reversed = reversed * 10 + digit.
  • Para testar primalidade, basta procurar divisores até a raiz do número.

Código C

#include <stdio.h>
#include <stdbool.h>

// Function to check if a number is prime
bool is_prime(int n) {
    // TODO: Implement prime checking logic (O(sqrt(N)))
    return false;
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1) {
        return 1;
    }

    // TODO: 1. Calculate sum of digits
    // TODO: 2. Reverse the integer N
    // TODO: 3. Check if reversed integer is Prime

    // Expected print format:
    // printf("Digit Sum: %d\n", sum);
    // printf("Reversed: %d\n", reversed);
    // printf("Status: %s\n", is_prime(reversed) ? "Prime" : "Composite");

    return 0;
}
Abrir no compilador
Solução e explicação

Percorra uma cópia de N e acumule a soma e a inversão. Zeros finais desaparecem ao inverter um inteiro: 100 vira 1.

Trate primeiro valores menores que dois e os divisíveis por dois ou três. Depois você pode testar candidatos 6k - 1 e 6k + 1. Para evitar estouros, compare o divisor com n / divisor.

O custo é O(log10(N) + sqrt(invertido)) e o espaço auxiliar O(1). 4321 é composto, pois 29 × 149 = 4321.

Código da solução

#include <stdio.h>
#include <stdbool.h>

bool is_prime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) return false;
    }
    return true;
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1) {
        return 1;
    }

    int temp = n;
    int digit_sum = 0;
    int reversed = 0;

    // Loop through digits using modulo and integer division
    while (temp > 0) {
        int rem = temp % 10;
        digit_sum += rem;
        reversed = reversed * 10 + rem;
        temp /= 10;
    }

    printf("Digit Sum: %d\n", digit_sum);
    printf("Reversed: %d\n", reversed);

    if (reversed <= 1) {
        printf("Status: Neither\n");
    } else if (is_prime(reversed)) {
        printf("Status: Prime\n");
    } else {
        printf("Status: Composite\n");
    }

    return 0;
}

Perguntas frequentes

Por que o código e a saída continuam em inglês?

Palavras-chave, identificadores e textos verificados pelos testes são preservados para não alterar o programa. As explicações e os controles estão traduzidos.