Newsgroup: it.comp.java
Titolo: il mio primo for

ciao
mi scuso da ora per le domande banali che farò.
Premetto che prima di postare ho provato un po' di cose ma senza risultato.
Devo fare un programmino scemo che dato un numero divida quel numero per
tutti i numeri minori alla ricerca di un divisore del numero stesso e
quindi capire se quel numero è primo o no
Ho pensato di fare un ciclo e di dividere i numeri precedenti in cerca di
resto == 0 , nel qual caso il numero è primo.
Ho anche pensato che resto non potesse essere int ma float perchè il resto
mettiamo di 45/44 è 0,02272 e che quindi avrebbe fatto sempre 0 in un'int.
ho scritto la seguente
----------------------------
float resto = 0;
        for (int i = numero - 1; i > 1; i = i - 1) //numero è il numero
immesso da tastiera inserito precedentemente in un int
              resto = numero%i;
              if (resto == 0.00000)
                      out.println("Il numero " + numero + " non e'
primo!");
              else
                      out.println("Il numero " + numero + " e' primo!");
--------------------------
Questo codice mi ritorna che qualunque numero è primo... mi date uno spunto
per capire dove sbaglio?
Grazie per le risposte
Excelsior,
Stefano

 Stefano
è perchè stai utilizzando dei float.
La spiegazione sta nel fatto che i numeri floating point presentano 
degli errori di arrotondamento dovuti alla loro rappresentazione in binario.
Quindi quando metti un numero come 1.2, in realtà puoi avere 1.199999999 
o 1.20000001.
Tutti i confronti di ugualianza con i floating point, quindi, andrebbero 
fatti così
a==b
ma in questo modo
a>=b-epsilon && a<=b+epsilon
con epsilon piccolo, compreso tra la precisione che vuoi tu e la 
precisione della macchina.
In ogni caso i numeri primi sono numeri *interi* divisibili solo per se 
stessi e l'unità, quindi perché stai utilizzando dei float?
LP

saxoni74 ha scritto:

Ciao, ti sei dimenticato delle parentesi. Vediamo:
float resto = 0;
for (int i = numero - 1; i > 1; i = i - 1)
	resto = numero%i;
if (resto == 0.00000)
	out.println("Il numero " + numero + " non e' primo!");
else
	out.println("Il numero " + numero + " e' primo!");
Questo e' tuo codice, con l'indentazione corretta. Devi sapere che se 
non racchiudi il corpo del tuo ciclo for tra parentesi graffe, viene 
eseguita in ciclo solo l'istruzione successiva, in questo caso:
resto = numero%i;
Il fatto che tutti i numeri ti risultino primi, deriva dal fatto che, 
come ultimo valore memorizzato in resto, c'e' quello che vale come 
condizione di uscita e cioe' i > 1, i = 2, resto = numero%2;
Dato che stai cercando numeri primi, suppongo tu stia inserendo numeri 
dispari, da cui resto != 0, Il numero e' primo!
Ciao, Corrado

saxoni74 ha scritto:
[..]
leggi bene il post di Corrado Alesso
in seguito ti invito a riflettere su questi fatti:
1- non è necessario che tu esamini tutti i numeri interi nel range
utile (vedi dopo per il range da scegliere)
infatti basta che numero/ i dia resto zero affinchè il numero non sia
primo e tu possa uscire dal ciclo.
Solo se il resto è SEMPRE diverso da zero il n. è primo
2- range utile
perchè esamini tutti i numeri da 2 a numero-1? Non puoi scegliere un
range più piccolo?
se devi scoprire se 27 è primo, ti basta scoprire che 27/3 da resto,
non c'e' bisogno di arrivare a 27/9
se questo esempio non ti ha chiarito le idee (perchè tanto con i=3
saresti uscito lo stesso dal ciclo):
esamina numero=51
devi esaminare i resti di 51/i, con i da 2 a ... 50?  o puoi fermarti
prima?

 non c'e' bisogno di arrivare a 27/9
ti ringrazio e ringrazio tutti per le risposte
è l'esercizio che lo chiedeva espressamente.
le opzioni b e c dicevano:
b- interrompere l'operazione quando viene trovato un divisore
c- ridurre il numero max di iterazioni osservando che se un numero ammette
un divisore allora ammette anche un divisore minore o uguale alla propria
radice quadrata.
PS come si calcola la radice quadrata di un numero? non ho ancora guardato
si fa sqrt qualcosa?
Grazie ancora ci lavoro e vi faccio sapere.
Stefano

 
ciao
ho fatto le prime due iterazioni ma mentre la seconda funizona:
 float resto = 0;
        for (int i = numero - 1; i > 1; i = i - 1) {
              resto = numero%i;
              if (resto == 0)
                      break;
        }
 
        if (resto != 0)
                out.println("Il numero " + numero + " e' primo!");
        else
                out.println("Il numero " + numero + " non e' primo!");
la prima non mi funziona solo con numeri che finiscono per 5 (55) me li
identifica come primi.
Ho capito perchè e allora ho cercato di mettere una pezza e ho messo un
boolean che se in una iterazione il resto == 0 mette la variabile a true e
poi faccio il confronto con il boolean (l'if intendo).
for (int i = numero - 1; i > 1; i = i - 1) {
              resto = numero%i;
              boolean primo = false;
              if (resto == 0)
                      primo = true;
        }
 
        if (primo == true)
                out.println("Il numero " + numero + " non e' primo!");
        else
                out.println("Il numero " + numero + " e' primo!");
Per la precisione si blocca  qui
if (primo == true)
con questo errore
cannot find symbol
da forse questo errore perchè la viariabile è dentro il FOR e lui fuori
dalle graffe non la vede o riconosce? Come posso ovviare a questo problema?
Grazie 1000
Stefano

 
LP


e a cosa ti serve? ;-)
se stai esaminando <numero > e devi iterare i da 1 a sqrt(numero), non
ti serve conoscere sqrt(numero), basta che ti fermi quando i è....
(in questo modo usi una operazione computazionalmente più leggera del
calcolo della sadice quadrata)

               resto = numero%i;
L'operatore "%" abbinato a due int, ti dà un int.
In altre parole, 45%44 dà come risultato 1!
Butta al mare tutti i float e fai il test
if (resto == 0) dove resto è un int