Online C Compiler
Apri nel compilatore

Edizione didattica italiana

Cicli in C: analizzare le cifre

Calcola la somma delle cifre, inverti un intero e classifica la primalità del risultato.

Apri nel compilatore

Cicli in C: analizzare le cifre
Calcola la somma delle cifre, inverti un intero e classifica la primalità del risultato.

Leggi un intero positivo N. Percorri le cifre per sommarle e costruire il numero invertito. Classifica il risultato come primo, composto oppure nessuno dei due se inferiore a due.

Usa aritmetica intera per visitare le cifre. Gli zeri iniziali del risultato scompaiono: 100 diventa 1. Le etichette di output restano inglesi per corrispondere esattamente ai test.

Input

Un intero positivo N.

Output

Tre righe: Digit Sum: <somma>, Reversed: <invertito>, poi Status: <Prime|Composite|Neither>.

Vincoli

  • 1 ≤ N ≤ 10⁹; limite di 1 secondo e 64 MB.
  • Usa un tipo intero abbastanza ampio per il numero invertito.
Suggerimenti
  • L’ultima cifra è n % 10; n / 10 la rimuove.
  • Costruisci il risultato con reversed = reversed * 10 + digit.
  • Cerca divisori fino alla radice quadrata per verificare la primalità.

Codice sorgente

#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;
}
Apri nel compilatore
Spiegazione della soluzione

Accumula somma e numero invertito nello stesso ciclo, poi gestisci separatamente valori inferiori a 2, il 2 e il 3.

Escludi multipli di 2 e 3 e prova candidati 6k ± 1. La condizione divisor <= n / divisor evita di calcolare un quadrato che potrebbe causare overflow.

Il tempo è O(log₁₀ N + √R), dove R è l’inverso, con O(1) memoria aggiuntiva. Per 1234, il risultato 4321 è composto: 29 × 149.

Codice della soluzione

#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;
}

Domande frequenti

Perché il codice e alcuni risultati restano in inglese?

Parole chiave C, identificatori, commenti del programma e output attesi restano quelli originali per preservare codice eseguibile e test coerenti. Spiegazioni e istruzioni sono tradotte.