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