• 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

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

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..

[r]

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