• Non ci sono risultati.

a.a.2011/2012 AndreaMarin Esercizi

N/A
N/A
Protected

Academic year: 2021

Condividi "a.a.2011/2012 AndreaMarin Esercizi"

Copied!
13
0
0

Testo completo

(1)

Andrea Marin

Universit`a Ca’ Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

a.a. 2011/2012

(2)

Test di primalit` a

Definizione (Numeri primi)

Un numero naturale ` e primo se ` e maggiore di 1 e ammette come divisori solo se stesso ed 1

I

La ricerca dei numeri primi ` e un tema affascinante e ancora molto attuale

I

Nelle prossime diapositive affronteremo il problema della ricerca dei numeri primi da un punto di vista diattico

I Lo scopo `e scrivi buoni programmi prima ancora di scriverli veloci!

(3)

Impostare il problema

I

Faremo uso del sottoprogramma is prime:

I

Prototipo della funzione:

int is prime(int n);

I

Daremo diverse implementazioni della funzione is prime

I

La funzione is prime restituisce la codifica di true se n ` e

primo, 0 altrimenti

(4)

Contare i divisori

I

Idea risolutiva:

I Conto i divisori compresi tra 1 e n inclusi

I Se sono esattamente 2 allora il numero `e primo, altrimenti non lo `e

I

Ciclo:

I Per provare se un numero i compreso fra 1 e n `e un divisore dobbiamo impostare un ciclo

I Sappiamo quante iterazioni deve fare?

I S`ı, sono esattamente n

I Quindi useremo il ciclo for

(5)

Soluzione 1

i n t i s p r i m e ( i n t n ) { i n t i , d i v i s o r i ; d i v i s o r i = 0 ;

f o r ( i =1; i <=n ; i = i +1) { i f ( n%i == 0 ) {

d i v i s o r i = d i v i s o r i + 1 ; }

}

r e t u r n ( d i v i s o r i == 2 ) ; }

(6)

Altro punto di vista

I

Cerco di ricondurmi ad un pattern noto

I

n > 1 ` e primo se tutti i numeri tra 2 e n − 1 sono coprimi con n

I

Devo testare una propriet` a su un insieme

I Assumo che sia vera

I e cerco l’elemento che la falsifica (un divisore di n)

I

Che ciclo usare?

I Ancora il ciclo for

(7)

Soluzione 2

i n t i s p r i m e ( i n t n ) { i n t i , p r i m o ; i f ( n > 1 ) {

p r i m o = 1 ; }

e l s e {

p r i m o = 0 ; }

f o r ( i =2; i < n ; i = i +1) { i f ( n%i == 0 ) {

p r i m o = 0 ; }

}

r e t u r n p r i m o ; }

(8)

Interrompere il ciclo

I

Osserviamo che non appena ` e stato trovato un divisore ` e inutile proseguire con la ricerca. . .

I

Il ciclo che cerca i diviso pu` o essere interrotto non appena un divisore ` e stato trovato

I

Il C mette a disposizione l’istruzione break che interrompe il ciclo che governa il blocco di cui fa parte

I

La prossima slide mostra l’uso del break che

per`o `e sconsigliabile!

I In questo corso eviteremo di usare il break come regola

I

Adesso so quante iterazioni devo compiere?

I No, quindi al posto del break perch`e non passare al while?

(9)

Soluzione col break (non usare)

i n t i s p r i m e ( i n t n ) { i n t i , p r i m o ; i f ( n >1) {

p r i m o = 1 ; }

e l s e {

p r i m o = 0 ; }

f o r ( i =2; i <n ; i = i +1) { i f ( n%i == 0 ) {

p r i m o = 0 ; break ; }

}

r e t u r n p r i m o ; }

(10)

Soluzione col return (non usare)

i n t i s p r i m e ( i n t n ) { i n t i , p r i m o ;

f o r ( i =2; i <n ; i = i +1) { i f ( n%i == 0 ) {

r e t u r n 0 }

}

r e t u r n ( n ! = 1 ) ; }

(11)

Soluzione con il while

i n t i s p r i m e ( i n t n ) { i n t i , p r i m o ;

p r i m o = ( n >1) ? 1 : 0 ; i = 2 ;

w h i l e ( ( i < n ) && p r i m o ) { i f ( n%i == 0 ) {

p r i m o = 0 ; }

i = i +1;

}

r e t u r n p r i m o ;

(12)

While vs. For

I

Quando useresti il while e quanto il for?

I Scrivere un programma che usando la is prime stampi tutti i numeri primi tra 2 e 100

I Scrivere un programma che usando la is prime stampi i primi 20 numeri primi

(13)

Esercizi

1.

Scrivere la funzione count prime che acquisito un intero n, restituisca il numero di numeri primi ≤ n;

2.

Scrivere la funzione next prime che acquisito un intero n, restituisca il pi` u piccolo numero primo m strettamente maggiore di n

I Esempio il primo successivo a 14 `e il 17. Il successivo del 17 `e il 19.

3.

Scrivere un programma che legga un numero naturale da

standard input e ne stampi la fattorizzazione in numeri primi

Riferimenti

Documenti correlati

[r]

Scrivere un programma che legga una sequenza di caratteri che termina quando l’utente immette un carattere non legale, e stampi il numero di caratteri minuscoli legali letti..

Abbiamo visto i primi, fondamentali, risultati sui numeri primi: l’insieme dei numeri primi è infinito, ogni numero è divisibile per un numero primo, il lemma di Gauss, il teorema

Rispondi: che cosa differenzia gli esponenti delle scomposizioni dei due insiemi.. Antonio Guermani,

Quest'opera è stata rilasciata con licenza Creative Commons:. Attribuzione - Non commerciale - Non opere derivate

Siano dati in input le informazioni su n libri di una biblioteca creando quattro vettori con il codice del libro, i loro prezzi, il codice della casa editrice e l’anno di

¨  Se la stringa di formato contiene un white space, la scanf legge zero o più white space, che verranno scartati, fino al primo carattere non white space.

( E' necessario quindi impostare due handler per i segnali SIGINT e SIGUSR1) Scrivere un programma C mamma che acquisisce da tastiera il pid del figlio, imposta un allarme di