Edizione didattica italiana
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 compilatoreSpiegazione 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.