Università Statale di Milano - Dipartimento di Informatica: 7a lezione sul Linguaggio GO (Golang)
Esercizio 1 – Numeri perfetti/amichevoli/primi gemelli sotto soglia
Si ricordi che:
- un numero naturale è perfetto se è uguale alla somma dei suoi divisori propri (per esempio, 6 = 1 + 2 + 3 è perfetto);
- due numeri naturali x e y, x < y, sono detti amichevoli se la somma dei divisori propri di ciascuno è uguale all'altro (i divisori propri di un numero sono tutti i divisori del numero - compreso l’1 – tranne il numero stesso); ad esempio (220, 284) è una coppia di amichevoli, essendo 284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 (dove 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 sono i divisori di 220) e 220 = 1 + 2 + 4 + 71 + 142 (dove 1, 2, 4, 71, 142 sono i divisori di 284); altri numeri amichevoli sono ad esempio le coppie 1184 e 1210, 2620 e 2924, 5020 e 5564, 6232 e 6368.
- un numero naturale è primo se è divisibile solo per se stesso o per 1; due primi p e q sono gemelli se p = q + 2.
Considerate il codice scritto per risolvere gli esercizi 10, 11, 12, 13 e 14 della lezione "Lab03 – Selezione/Iterazione", ristrutturatelo definendo funzioni in modo da riutilizzarlo per scrivere un programma che:
- riceva in input un numero intero strettamente positivo (che chiameremo soglia);
- legga un valore intero che specifica il tipo di computazione da effettuare:
1: identificazione e stampa di numeri perfetti sotto soglia;
2: identificazione e stampa di numeri amichevoli sotto soglia;
3: identificazione e stampa di primi gemelli sotto soglia;
(gestendo l’inserimento di un valore di scelta non compreso in [1, 3]);
- stampi a video l’output corrispondente.
Per esempio:
a) Se il valore di soglia fosse 1000 e venisse scelta l’opzione 1, l’output corrispondente sarebbe:
Numeri perfetti inferiori a 1000:
6
28
496
b) Se il valore di soglia fosse 3000 e venisse scelta l’opzione 2, l’output corrispondente sarebbe:
Numeri amichevoli inferiori a 3000:
(220, 284)
(1184, 1210)
(2620, 2924)
c) Se il valore di soglia fosse 15 e venisse scelta l’opzione 3, l’output corrispondente sarebbe:
Numeri primi gemelli inferiori a 15:
3, 5
5, 7
11, 13
Soluzione esercizio n. 1
/*
Dati due numeri interi il programma controlla se sono amichevoli
*/
package main
import (
. "fmt"
"math"
)
func main() {
var n1, n2 int
Println("Inserire due numeri interi separati da uno spazio: ")
Scan(&n1, &n2)
somma1 := divisori(n1)
if somma1 == n2 {
somma2 := divisori(n2)
if somma2 == n1 {
Println(n1, " e ", n2, " sono numeri amichevoli")
} else {
Println(n1, " e ", n2, " non sono numeri amichevoli")
}
} else {
Println(n1, " e ", n2, " non sono numeri amichevoli")
}
}
func divisori(n int) (somma int) {
Print("Divisori di ", n, ":")
for i := 1; i < n; i++ {
if math.Mod(float64(n), float64(i)) == 0 {
Print(" ", i)
somma += i
}
}
Println("\nSomma = ", somma)
return
}
Soluzione esercizio n. 2
/*
Dati due numeri interi il programma controlla se sono gemelli
*/
package main
import (
. "fmt"
"math"
)
func main() {
var n1, n2 int
Println("Inserire due numeri interi separati da uno spazio: ")
Scan(&n1, &n2)
if isPrimo(n1) && isPrimo(n2) && (math.Abs(float64(n1-n2)) == 2) {
Println(n1, " e ", n2, " sono primi gemelli")
} else {
Println(n1, " e ", n2, " non sono primi gemelli")
}
}
func isPrimo(n int) bool {
var primo bool = true
for i := 2; i <= n/2; i++ {
if math.Mod(float64(n), float64(i)) == 0 {
primo = false
}
}
if primo {
Println(n, " è primo")
}
return primo
}
Commenti
Posta un commento