Transcript Lezione 6:Crivello Di Eratostene
Crivello Di Eratostene
(fonte http://it.wikipedia.org/wiki/Crivello_di_Eratostene#Algoritmo) Si scrivono tutti i naturali a partire da 2 fino n in un elenco detto setaccio (in un array ). Poi si cancellano (setacciano) tutti i multipli del primo numero del setaccio (escluso lui stesso). Si prosegue così fino ad arrivare in fondo. I numeri che restano sono i numeri primi minori od uguali a n.
È come se si utilizzassero dei setacci a maglie via via più larghe: il primo lascia passare solo i numeri non multipli di 2, il secondo solo i non multipli di 3, e così via.
Nel caso n = 50, ad esempio, il procedimento di setacciatura si conclude con il numero 7 perché 7 è il massimo primo il cui quadrato non supera 50 e si può provare che il procedimento di setacciatura per ricercare i primi fino ad un certo numero n cessa sempre quando si supera la radice quadrata di n.
Esempio
#include
for (i = 2; i <= sqrt(DIM); i++) /*la funzione sqrt(DIM) da come valore la radice quadrata di DIM*/ { } for (j = i + 1; j <= DIM; j++) { if (v[j] % i == 0) { /*Verifico se il valore i-esimo del vettore v possiede dei multipli, scorrendo tutti i suoi i-esimi valori successivi */ } } v[j] = 0; /*Se è vero allora "cancello" i suoi multipli inserendo uno 0 */
/*Ora il vettore contiene tutti i numeri primi più gli zeri, quindi occorre "compattare" il vettore eliminando gli zeri */ for (i = 2; i <= DIM; i++) { } if (v[i] != 0) { //Se l'elemento i-esimo del vettore v non è uno 0 } p[k] = v[i]; /*Inserisco il valore nel vettore p che conterrà solo i numeri (primi) senza gli 0 */ k++; /*Incremento la variabile k che servirà per determinare la dimensione del vettore p di primi */ //Stampo a video for (i = 0; i < k; i++) { printf ("%d\t", p[i]); } } return 0;
Scrivere un programma che inizializza un vettore monodimensionale di interi e poi copia il vettore in un altro vettore della stessa dimensione.
#include
In una gara il punteggio di ciascun atleta è dato dal pubblico. I voti possono andare da 0 a 4. Scrivere un programma che per ogni atleta rilevi il numero di occorrenze dei vari voti.
a. con switch…case; b. con i vettori #include
int voto[5]={0}, i=0,j=0; for(j=0;j<=4;j++) { printf("Inserisci un voto per la mensa (tra 0 e 4):"); scanf("%d",&i); voto[i]++; }
Leggere, ed inserire in un array, una stringa di caratteri formata solo da lettere minuscole e dallo spazio e terminata da '$'. Quindi: 1- Per ogni carattere della stringa, mettere il carattere alfabeticamente successivo; 2-Il carattere successivo della 'z' sarà la 'a'; 3- il carattere successivo dello spazio, sarà '_'. Per esempio, 'a' -> 'b' , 'g' -> 'h', 'z' -> 'a', ' ' -> '_'.
4- Stampare la stringa così codificata.
NOTA: assumiamo che l’utente inserisca tutti i caratteri in una volta sola e quindi prema ENTER.
Usiamo il contatore per trovare la fine della stringa.
[azzera contatore i] [leggi carattere] while ([il carattere letto non è ‘$’]) { [inserisci carattere nella posizione i-esima dell’array; incrementa i] [leggi carattere] } [azzera contatore i] for if ([per ogni cella dell’array, fino alla (i-1)-esima]) { ([il carattere è lo spazio]) { [inserisci ‘_’ nell’array che conterrà il risultato] } else if ([il carattere è minore di ‘z’]) { [inserisci il carattere alfabeticamente successivo nell’array risultato] } else { [inserisci ‘a’ nell’array del risultato] } } for ([per ogni cella dell’array, fino alla (i-1)-esima]) { [scrivi carattere] }
{ #include
while (c != terminatore)
{ stringa[numCaratteri] = c; numCaratteri++; scanf ( "%c" , &c); }
for (i = 0 ; i < numCaratteri; i++)
{
if (stringa[i] == ' ‘ )
{ codifica[i] = '_‘ ; }
else if (stringa[i] < 'z‘ )
{ codifica[i] = stringa[i] + 1 ;}
else
{ codifica[i] = 'a‘ ; } } } printf ( "\nStringa codificata: " );
for (i = 0 ; i < numCaratteri; i++)
{printf ( "%c" , codifica[i]);