Esercizi2 - Home di homes.di.unimi.it

annuncio pubblicitario
Laboratorio di programmazione
9 novembre 2016
Sequenze di Collatz
Considerate la seguente regola: dato un numero intero positivo n, se n è pari lo si divide per 2, se è dispari lo si
moltiplica per 3 e si aggiunge 1 al risultato. Quando n è 1 ci si ferma.
Questa semplice regola permette di costruire delle sequenze: la sequenza che si costruisce a partire dal
numero n è detta sequenza di Collatz di n. Ad esempio, la sequenza di Collatz di 7 è:
7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
È un noto problema aperto stabilire se ogni sequenza di Collatz termina (cioè, se arriva a 1).
Scrivete un programma che chiede all’utente un numero e mostra la sequenza di Collatz del numero (con tanto
di lunghezza).
Esempio di funzionamento
Numero: 7
7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Lunghezza: 17
Numero: 9
9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Lunghezza: 20
Medie
Data una sequenza di numeri reali x1, x2,..., xn, sono dette rispettivamente:
1
Scrivete un programma che legga una sequenza di numeri reali in input. L’inserimento va terminato appena
l’utente inserisce il valore -1.
Per ogni valore inserito (xi) il programma controlla che esso sia STRETTAMENTE positivo, ovvero xi > 0; se ciò non
accade il valore non viene considerato. Altrimenti il programma utilizza anche xi per il calcolo delle 4 medie. Per
svolgere l’esercizio usate Math.sqrt(double), Math.exp(double) e Math.log(double), che calcolano,
rispettivamente, la radice quadrata, l’esponenziale e il logaritmo naturale del loro argomento.
Suggerimento. Naturalmente, per leggere la sequenza di numeri reali dovete usare un ciclo. Durante questo stesso
ciclo potete:
-
Controllare che l’input sia strettamente positivo
aggiornare i valori che vi servono per calcolare le varie medie utilizzando il nuovo valore letto (solo
se esso è maggiore di zero). Per esempio, per poter calcolare la media aritmetica vi servirà una
variabile (che indicheremo con n in questo suggerimento) in cui tenere il numero di valori letti fino
a quel momento e una variabile (detta “accumulatore”, e indicata con tot in questo suggerimento)
contenente la somma dei valori letti fino a quel momento (di che tipo devono essere queste due
variabili?). Ogni volta che viene letto un nuovo valore si incrementa di uno la variabile n e si
incrementa la variabile accumulatrice tot del valore letto (entrambe le variabili devono essere
inizializzate a 0 prima del ciclo). State attenti a non incrementare né n né tot quando leggete un
valore nullo o negativo o, nello specifico, il valore -1, che ha come unico scopo quello di terminare
la sequenza degli input.
Esempio di input senza valori da scartare
2 4 5 -1
Esempio di output
Media aritmetica: 3.666667
Media geometrica: 3.419952
Media quadratica: 3.872983
2
Media armonica: 3.157895
Notate che avrei ottenuto lo stesso output se i valori inseriti fossero stati:
-3 -7 4 2 -600 -1000 -3000 5 -1
Numeri perfetti
A) Un numero è perfetto se è uguale alla somma dei suoi divisori propri. Per esempio, 6 = 1 + 2 + 3 è perfetto.
Scrivete un programma che, dato un intero in input scriva se esso è perfetto.
Esempio di esecuzione:
numero: 30
30 non è perfetto
numero: 6
6 è perfetto
B) Estendete il programma in modo che esso legga un numero “limite” e scriva quindi i numeri perfetti minori
dell’intero dato.
Suggerimento: per fare ciò potete inserire il programma precedente in un ciclo che per ogni intero minore del
limite controlla se esso è perfetto e in tal caso lo stampa.
Esempio di esecuzione
Limite? 1000
6
28
496
3
Numeri amichevoli
A) Due numeri interi (x, y) sono detti amichevoli se la somma dei divisori di ciascuno è uguale all’altro (fra i
divisori è compreso l’1 escluso il numero stesso). Ad esempio (220,284) è una coppia di amichevoli, essendo
284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 (che sono i divisori di 220)
220 = 1 + 2 + 4 + 71 + 142 (che sono i divisori di 284).
Gli antichi greci ritenevano che le coppie di numeri amichevoli avessero certe proprietà mistiche.
Scrivete un programma che, chieda in ingresso all’utente due numeri interi, che chiameremo n1 e n2; il
programma deve quindi controllare e comunicare all’utente se n1 e n2 sono amichevoli. SUGGERIMENTO:
dovete cercare i divisori di n1 (con un ciclo….), sommarli man mano che li trovate (con un accumulatore…) e
controllare se la somma totale dei divisori di n1 è uguale a n2.
SE la risposta è negativa, allora n1 e n2 non sono amichevoli (fine programma),
ALTRIMENTI procedete controllando se anche la somma dei divisori di n2 è uguale a n1.
Esempio di funzionamento richiesto:
Inserire primo intero:
220
Inserire secondo intero:
228
Divisori di 220: 1 2 4 5 10 11 20 22 44 55 110.
Somma = 284
Divisori di 284: 1 2 4 71 142
Somma = 220
220 e 284 sono numeri amichevoli
Inserire primo intero
3
Inserire secondo intero:
7
Divisori di 3: 1 2
Somma 3
3 e 7 non sono numeri amichevoli
B) Estendete il programma in modo che, letto un intero “limite”, stampi le coppie di numeri amichevoli minori
del limite.
4
Primi gemelli
A) Due primi p e q sono gemelli se p = q + 2. Scrivete un programma che calcola se due numeri sono primi gemelli.
( A tal fine dovete controllare che: p e q siano primi e che p=q+2 se p è il maggiore tra q e p)
Esempio di esecuzione
Numeri?
35
Sono primi gemelli
Numeri?
7 11
Non sono primi gemelli
B) Estendete il programma precedente in modo da sviluppare un programma che stampi primi gemelli minori di
un intero “limite” fornito dall’utente. (Suggerimento: usate un ciclo che scorra i numeri da 1 al limite e, per
ogni numero primo q minore del numero dato, controlli se anche q+2 è primo ed è minore del numero dato
come limite: in tal caso i due primi trovati sono gemelli. Alternativamente il ciclo può partire da limite-1 e
decrementare fino a 1: per ogni primo p trovato, può controllare se anche q = p-2 è primo…. INSOMMA CI
SONO TANTE STRADE DIVERSE ma BUONE e GIUSTE per la risoluzione del problema!)
Esempio di esecuzione
Numero? 20
35
57
11 13
17 19
Stampa sequenza di numeri al contrario
Scrivere un programma che prenda in ingresso una sequenza di numeri interi strettamente positivi x1, x2,..., xn
(l’inserimento termina al primo numero negativo inserito e scarta eventuali zeri inseriti dall’utente). Letta la
sequenza, il programma la stampa in ordine invertito e ne calcola quindi il valore xn-xn-1+x n-2-x n-3+ x n-4-…x1.
Esempio di esecuzione
Inserisci i numeri:
3
5
0
7
5
9
-6
Termine inserimento. Sequenza in ordine inverso:
9753
Valore da calcolare=4
6
Scarica