Veramente ti avevo detto di fermarti alla radice del numero, che è in generale molto minore della sua metà. Poi, soprattutto, è sbagliato il meccanismo dei return...
Di seguito gli errori:
1. se la condizione dell'if è verificata allora fai risp = false, poi? Dove va a finire quel risp? In ogni caso la funzione ritorna true, e questo è ovviamente un errore
2. risp || true è sempre true, per definizione dell'operatore OR
3. se trovi un suo divisore imposti risp = false. Se però, in una delle iterazioni successive trovi che i non è un divisore di n allora risp torna ad essere true, e questo è chiaramente sbagliato
La sostanza è che
appena trovi un divisore, puoi subito concludere che il numero non è primo. Invece, per dire che un numero è primo, devi scorrere tutti i possibili divisori e verificare che nessuno lo divide perfettamente.
Un esempio di funzione:
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;
}