Iniziamo con la DEFINIZIONE di numero PRIMO:
un numero e' primo se e' DIVISIBILE per se stesso e per l'unita'.
Quindi se e' divisibile per QUALUNQUE altro numero MINORE di lui, allora NON E' primo. Ne basta UNO per dire che non e' primo !!!
ALTRA questione se si vuole FATTORIZZARE il numeri, nel qual caso bisogna tenere traccia dei numeri che lo dividono
ALTRA questione ancora e' CONTARE i sui divisori, nel qual caso il TUO ragionamento andrebbe QUASI bene se non fosse per un errore concettuale che hai scritto
ZERO (o trucco ZERESIMO) : NON SI CONSIDERA MAI il numero 1. Tutta la
teoria dei numeri NON CONSIDERA MAI il numero 1, perche' incasinerebbe la teoria senza portare a NESSUN beneficio. Poiche TUTTI i numeri sono divisibili per 1, TUTTI i numeri sarebbero NON PRIMI. Il che non ha senso, ovviamente .
PRIMO trucco: se e' pari (divisibile per 2) allora NON E' PRIMO.
Questo potrebbe essere fatto in modo molto efficiente senza nemmeno fare la divisione, cosi come ci sono trucchetti che ti permettono di testare in modo efficiente se il numero e' divisibile per 3, 5, ecc. Ma questa e' un'altra storia
SECONDO trucco: siccome TUTTE i numeri pari sono multipli di 2, una volta che hai testato per 2 NON SERVE testare la divisibilita' per i numeri pari ma SOLO per i numeri dispari, quindi 3, 5, 7, ...
TERZO trucco: invece di testarlo per TUTTI i numeri DISPARI da 3 a n-1, si puo' fare un po' di meglio.
Supponi che il numero sia composto da due numeri piu' piccoli: n = a*b
Ora uno sara' piccolo, diciamo 'a', ed uno sara' grande, diciamo 'b' ('b > a' ma potrebbe essere anche il contrario, va bene lo stesso)
Se 'a' aumenta, puo' aumentare anche 'b'? OVVIAMENTE no, visto che il prodotto deve rimanete costante. Quindi, se trovi un 'a' piu' grande, NECCESSARIAMENTE 'b' dovra' essere piu' piccolo.
Dove e' il punto di equilibrio? Quando i due numeri sono uguali (sempre se esistono). Allora avremo n = a*b = a*a = b*b = a^2
QUNDI questo suggerisce che NON SERVE testare n per TUTTI i numeri piu' piccoli di lui, ma SOLO per tutti i numeri piu' piccoli della sua RADICE QUADRATA, perche' se esiste un numero piu' grande della radice quadrata che divide 'n' allora l'ALTRO numero DEVE ESSERE NECESSARIAMENTE piu' piccolo della radice quadrata,e quindi lo troveresti PRIMA di quello piu' grande
QUARTO: troppo facile usare la libreria per calcolare la radice quadrata di numeri con la virgola , IMPLEMENTA la funzione per calcolare la radice quadrata usando SOLO gli interi. E' MOOLTO semplice, tanto quanto sapere se un numero e' primo (anzi, anche piu' semplice)
https://en.wikipedia.org/wiki/Integer_square_roo
QUINTO: esistono gia' tabelle dei primi MILIONI di numeri primi. Invece di generare da te i numeri primi, potresti usare una tabellina gia' pronta contenente, ad esempio, i primi, 100
SESTO: per numeri MOOOLTO grandi, questo sistema NON FUNZIONA (ci vorrebbero ore, giorni, mesi o anni, o peggio, millenni, per testarne la primalita'). Esistono dei TEST DI PRIMALITA' piu' efficienti ma meno precisi.
Ma questo solo per darti un'idea che i test di primalita sono un mondo decisamente strano e affascinate.
QUESTO PER DIRE che il tuo ragionamento fa acqua un po' da tutte le parti
CONSIDERAZIONE: EVITA COME LA PESTE di dover inserire ogni volta a mano il numero da testare, ALMENO fino a che il programma non funziona. Rallenta inutilmente le prove. Invece scrivi il numero DIRETTAMENTE dentro il codice, e testa se funziona
Quando il codice funziona, puoi reintrodurre la prate di codice che chiede all'utente il numero da testare.
>>>>>>
Ed addesso vediamo il PASTICCIO del TUO CODICE: e' un pasticcio! Non vale la pena nemmeno tentare di correggerlo.
Riscrivilo da 0 nel seguente modo:
1) imposta 'n' a 100 (giusto per iniziare)
2) scandisci i numeri da 2 a 100
3) per OGNI numero controlli SE E' primo: quindi ti serve una FUNZIONE che data un numero intero dice se e' primo (ritorna 1) oppure no (ritorna 0)
4) se il numero e' primo (la funzione ha ritornato 1) STAMPI il numero
NON TOCCHI PER NESSUN MOTIVO l'indice del ciclo for che usi per scandire i numeri.
QUINDI, a parte nel ciclo for, TU NON GLI CAMBI IL VALORE come invece fai nel tuo codice
E come dire ad un amico: "dammi un numero",
Lui te lo da e tu gli tiri un ceffone.
Poverino, ma che ti ha fatto