Scaricare la presentazione
1
Modifica Crivello di Eratostene
Esercizio n° 009 Modifica Crivello di Eratostene
2
/** * Calcola il numero di primi minori di n */
Corso di Programmazione in Java – Esercizio n° 009 Nelle lezioni precedenti abbiamo avuto modo di conoscere il Crivello di Eratostene, metodo utilizzato per ricercare i numeri primi contenuti nei primi n numeri naturali… /** * Calcola il numero di primi minori di n */ import java.util.Bitset; int Crivello_Eratostene(int n) { BitSet primi = new BitSet(n); primi.set(2,n); int i=1; while (i*2<n) { i = primi.nextSetBit(i+1); for(int k=i*2; k<n; k+=i) primi.clear(k); } return primi.cardinality(); Modificare l’esempio utilizzando un Vector al posto di un BitSet. Fornire non solo il numero dei primi trovati, ma anche quali sono. Istituto Statale di Istruzione Superiore “F. Enriques”
3
La prima soluzione che mi è venuta in mente è la seguente:
Corso di Programmazione in Java – Esercizio n° 009 La prima soluzione che mi è venuta in mente è la seguente: Creo un vettore contenente un numero di booleani pari al numero di interi dell’intervallo che devo prendere in considerazione. Setto il valore di tutti gli elementi su Vero. Setto il valore di 0 e 1 su Falso perché non sono primi per default. Partendo dall’inizio scorro il vettore alla ricerca di elementi “Vero” e ogni volta che ne trovo uno rendo “Falso” tutti i suoi multipli, quindi partendo dal 2 … V F V F V Istituto Statale di Istruzione Superiore “F. Enriques”
4
che è una informazione che si può utilizzare gratuitamente…
Corso di Programmazione in Java – Esercizio n° 009 Poi mi sposto sull’elemento “Vero” successivo, cioè il 3, e ricomincio… ecc.. Come avrete potuto notare, il vettore non contiene il numero da analizzare, ma un valore booleano, per analizzare il numero si sfrutta l’indice del vettore… visto che è una informazione che si può utilizzare gratuitamente… Quindi per fornire la cardinalità dei nostri numeri primi, occorrerà scorrere il vettore e contare quanti elementi sono impostati come “Vero”. Per fornire l’elenco dei numeri primi trovati invece, occorrerà scorrere di nuovo il vettore ma a differenza del punto precedente questa volta non si effettua la somma, ma si stampa semplicemente l’indice dell’elemento il cui valore è impostato a “Vero”. Per risolvere il problema ho creato una classe Eratostene, con un costruttore che, dato un intero, si calcola il vettore con il metodo visto adesso, e due metodi stampa_cardinalita e stampa_contenuto. F V Istituto Statale di Istruzione Superiore “F. Enriques”
5
Vector primi= new Vector( );
Corso di Programmazione in Java – Esercizio n° 009 class Eratostene { private int n; Vector primi= new Vector( ); public Eratostene(int numero_interi) //Costruttore n=numero_interi; Boolean falso= new Boolean(false); //I vettori possono contenere soltanto Boolean vero= new Boolean(true); //oggetti e non tipi fondamentali… for(int i=0; i<n; i++) primi.insertElementAt(vero,i); //Setto tutti gli elementi a “Vero” primi.setElementAt(falso,0); //Lo zero non è un numero primo primi.setElementAt(falso,1); //Il numero 1 non è un numero primo for(int i=0; i*2<n; i++) //Scorro il vettore… if(((Boolean)primi.elementAt(i)) = = true) //…alla ricerca di elementi “Vero” for(int k=i*2; k<n; k+=i) //In caso positivo cerco i suoi multipli… primi.setElementAt(falso, k); // …e li setto come “Falso” } … la classe Eratostene continua nella diapositiva successiva … Istituto Statale di Istruzione Superiore “F. Enriques”
6
…continuo della classe Eratostene della diapositiva precedente …
Corso di Programmazione in Java – Esercizio n° 009 …continuo della classe Eratostene della diapositiva precedente … public void stampa_cardinalita( ) //Stampa la cardinalità del nostro insieme { // di numeri primi int j=0; for(int i=0; i<n; i++) { if (((Boolean)primi.elementAt(i)) = = true) j++; } System.out.println("I primi contenuti nell'intervallo tra 0 e "+ (n-1) +" sono: " +j); public void stampa_primi( ) //Stampa i numeri primi individuati System.out.println("I primi nell'intervallo tra 0 e "+ (n-1) +" sono:"); System.out.print(i+" "); //NOTA BENE, Questa stampa non stampa il } //valore dell’elemento ma il suo indice…. Istituto Statale di Istruzione Superiore “F. Enriques”
7
se il risultato ottenuto è effettivamente corretto oppure no.
Corso di Programmazione in Java – Esercizio n° 009 A questo punto non rimane altro da fare che scrivere il main che istanzi un oggetto dalla classe che abbiamo appena creato; Ciò ci permetterà di verificare se il risultato ottenuto è effettivamente corretto oppure no. public static void main(String[] args) { // TODO code application logic here Eratostene x = new Eratostene(100); x.stampa_cardinalita(); x.stampa_primi(); } Con cui ottengo il seguente risultato: I primi contenuti nell'intervallo tra 0 e 99 sono: 25 I primi nell'intervallo tra 0 e 99 sono: Istituto Statale di Istruzione Superiore “F. Enriques”
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.