Un esercizio classico col c++ che trova i numeri primi inferiori ad una soglia letta in input. In questa versione utilizziamo una funzione che restituisce vero/falso se un numero come parametro è primo.
Il cuore del problema è trovare se un numero è primo o meno con una funzione, così da poter creare un ciclo che successivo che alimenta la funzione e torna il risultato in modo da procedere o meno alla stampa sempre dal programma principale.
Quando siamo di fronte ad un problema matematico, è sempre bene fare degli esempi numerici o partire dalle definizioni per capire come trasformarle poi in codice. In particolare un numero è primo quando è divisibile solo per se stesso e per l’unità. Quindi per approcciare in modo semplice il problema potrei contare quanti numeri dividono il numero da analizzare e valutare se sono solo due, se stesso e l’unità, o più. Nel primo caso avremo trovato che è primo!
#include <iostream>
using namespace std;
bool numeroprimo(int num)
{
int cont=0;
for (int i = 1 ;i <= num; i++)
{
if (num % i == 0)
cont++;
}
if (cont == 2)
return true;
return false;
}
int main()
{
int n;
cout << "|----------------------------|" << endl;
cout << "| STAMPA NUMERI PRIMI |"<<endl;
cout << "|----------------------------|" << endl;
do
{
cout<<"inserire il numero limite ";
cin>>n;
}
while (n < 0);
for (int i = 1; i < n; i++)
{
if (numeroprimo (i) == true)
cout<<"il numero "<<i<<" è primo"<<endl;
}
return 0;
}
In realtà si può ulteriormente semplificare: i divisori di un numero sono solo nella sua prima metà, quindi paradossalmente il nostro controllo potrebbe partire da 2, visto che 1 è un divisore banale ed arrivare a cercare divisori fino a n/2 con n il numero da controllare. A questo punto basta trovare un numero che divide per essere sicuri che il numero non sia primo e tornare direttamente falso, altrimenti se non avremo trovato divisori potremo tornare vero che è un numero primo.
La seconda versione ottimizzata della funzione:
bool numeroprimo(int num)
{
int cont=0;
for (int i = 2 ;i <= num/2; i++)
{
if (num % i == 0)
return false;
}
return true;
}
Ultima modifica 26 Ottobre 2022