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...