Ciao, ho guardato il tuo codice e a prima vista l'algoritmo sembra corretto. Non mi intendo di Pascal, quindi non so indicarti errori dovuti magari a caratteristiche particolari del linguaggio (casting ecc). Ti posso solo consigliare di provare a usare una parentesi che racchiuda entrambe le condizioni nel WHILE, ma non so quanto possa essere utile.
Posso invece suggerirti una modifica a livello algoritmico, che può rendere più veloce il programma. Al posto di controllare i divisori di n fino ad n stesso, è sufficiente controllarli fino alla sua radice quadrata, o meglio il più grande intero inferiore a sqrt(n); infatti se ipoteticamente n = h*k, con h <> k, uno dei due deve essere per forza minore di sqrt(n), altrimenti si avrebbe h*k > sqrt(n)^2 = n, che è un assurdo data l'ipotesi di partenza. Per evitare qualsiasi errore di approssimazione, è bene comunque (anche se matematicamente parlando non serve) arrivare a controllare fino a sqrt(n)+1.
Ti posto il codice che scriverei io:
In questo caso devi poi inserire il controllo per n = 2, che ovviamente non funziona col mio codice, poiche controlli che 2 mod 2 = 0 e ti porta ad avere f=2. Se invece non aggiungi il +1 a sqrt(n) tutto funziona a meravigliacodice:FUNCTION primo(n:integer):integer; BEGIN f:=1; a:=1; WHILE (a<=trunc(sqrt(n))+1) AND (f=1) DO BEGIN IF (n MOD a) = 0 THEN BEGIN f:=2; END; a:=a+1; END; return f; END;
Questo non risolve il problema che hai; per quello non so aiutarti, mi spiace.
Ciao![]()


Rispondi quotando