Esercizi C/C++ per principianti

Verificare se un numero è primo in C e C++

In questa lezione verificherai se un intero è primo provando i divisori fino alla sua radice quadrata.

Introduzione

Un numero primo è maggiore di 1 e divisibile solo per 1 e per se stesso. Per verificarlo, dividiamo il numero per i valori più piccoli. Basta però provare fino alla radice quadrata del numero, il che rende il programma molto più veloce.

Punti importanti

  • Attiva gli avvisi del compilatore (compiler warning) e correggili tutti.
  • Comprendi bene il tipo di dato e la durata (lifetime) di ogni valore.
  • Controlla sempre i dati in ingresso e i limiti degli indici degli array.

Esempi di codice C e C++

C
Esegui →
main.c
#include <stdio.h>
int main(void) {
    int number = 29, prime = number > 1;
    // A composite number has a factor no larger than its square root.
    for (int divisor = 2; divisor * divisor <= number; ++divisor)
        if (number % divisor == 0) { prime = 0; break; }
    printf("%d is %sprime\n", number, prime ? "" : "not ");
}
Risultato dell'esecuzione
29 is prime
C++
Esegui →
main.cpp
#include <iostream>
int main() {
    int number = 29;
    bool prime = number > 1;
    // Stop after the square root and on the first divisor.
    for (int divisor = 2; divisor * divisor <= number && prime; ++divisor)
        prime = number % divisor != 0;
    std::cout << number << " is " << (prime ? "" : "not ") << "prime\n";
}
Risultato dell'esecuzione
29 is prime

Confronto tra C e C++

Il ciclo continua solo finché divisor * divisor <= number, perché se il numero ha un divisore maggiore della radice quadrata, questo è accompagnato da un divisore più piccolo già controllato. Appena trova un divisore, la versione in C esce dal ciclo con break, mentre quella in C++ si ferma grazie alla condizione && prime. Il risultato mostra che 29 è primo.

C

C usa piccole funzioni procedurali e mostra apertamente come i dati sono rappresentati in memoria.

C++

C++ continua a permettere il lavoro a basso livello, ma aggiunge tipi di libreria e astrazioni più sicure.

Esercizi di approfondimento

Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.

  • Prova input non validi e valori ai limiti.
  • Compila con i flag -Wall -Wextra -Wpedantic per attivare più avvisi.
  • Sposta le dichiarazioni condivise in un file header e l'implementazione in un altro file.

Esercitati con una sfida

Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.

Tutte le sfide