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