Problema con un piccolo programmino

di il
1 risposte

Problema con un piccolo programmino

Salve a tutti sono nuovo del forum,sono uno studente e attualmente sto studiando informatica.Da poco più di un mese stiamo iniziando a fare qualche programmino e oggi ho riscontrato un problema;in pratica il programma consiste nel chiedere all'utente quanti numeri (in ordine crescente)primi vuole visualizzare,il programma non ha nessun errore di sintassi,devo aver sbagliato qualche ragionamento ma non capisco cosa.

Ecco il codice:

#include <iostream>
#include "stdio.h"

using namespace std;

int main(void) {
int x; // x sono i numeri primi da stampare
cout << "Quanti numeri primi vuoi visualizzare?" << endl;
cin >> x;
int c; // c è un contatore che serve per uscire dal ciclo for appena il programma ha trovato i numeri da stampare
for (c=1;c<=x;c++)
{
int N=2; // N è il numero che andremo a stampare,lo inizializzo a 2 e poi per trovare altri numeri primi lo incremento
int i=2; // i è un contatore che utilizzo per controllare che N sia un numero primo
bool flag_trovato=false; //flag_trovato=false numero non primo
if (N%i) // se il numero N diviso 2 dà resto 0 N non è sicuramente primo
{
flag_trovato=false;
}
else
{
i=i+1;
}
if (i<= N/2)
{
flag_trovato=false;
}
else
{
flag_trovato=true;
}
while (flag_trovato==false)
{
N++;
}
cout << N;

}

return 0;
}

Dopo che eseguo il programma,scelgo quanti numeri primi visualizzare ma il programma mi dà come risultato solo dei 2 (variabile N nel codice che però ho incrementato successivamente).

Ringrazio in anticipo tutti quelli che risponderanno!

1 Risposte

  • Re: Problema con un piccolo programmino

    Ciao, è sbagliato il modo in cui verifichi che il numero sia primo. Non ha molto senso, comunque cerchiamo di capire perché stampa sempre 2: tu parti da N=2 e i=2, poi ti chiedi se i divide perfettamente N, e la risposta è ovviamente sì. A questo punto il primo if diventa vero e flag_trovato viene settato a false. Nell'if successivo ti chiedi se i <= N/2 e la risposta è no, quindi diventa sempre vero l'else, che setta flag_trovato a true. Quindi dopo questi passaggi il flag_trovato è sempre a true. A questo punto il while non viene eseguito perché la condizione flag_trovato == false non è soddisfatta e si arriva al cout << N, che infatti stampa 2.

    Ti posto invece una funzione che controlla se un numero è primo oppure no: prende in ingresso (come parametro) il numero da controllare e restituisce true se il numero è primo oppure false se non lo è. Puoi provare ad impiegarla nel tuo codice così com'è oppure a rielaborarla per inserire il controllo direttamente nel main (se per qualche motivo non vuoi utilizzare funzioni separate).
    
    bool is_primo(int numero)
    {
        int radice = sqrt(numero);
    
        for(int i=2; i<radice+1; ++i) {
            if(numero % i == 0) {
                // numero e' divisibile per i --> non e' primo
                return false;
            }
        }
        // sono arrivato fino a qui senza trovare divisori --> e' primo
        return true;
    }
    Nota: il contatore dei numeri primi lo devi incrementare solo se ne trovi uno, quindi un for può non essere il ciclo più adatto perché l'incremento viene fatto al termine di ogni iterazione, indipendentemente da quello che è successo prima. Prova invece con un while...
Devi accedere o registrarti per scrivere nel forum
1 risposte