Indovinelli con Scratch

In questa lezione realizzemo un gioco con gli indovinelli con Scratch.
Proporremo 4 semplici indovinelli:
1) Giro curioso nel bosco fitto e frondoso. Mi arrotolo in palla, sono piccolo e gioioso.
2) Mi nutro di insetti nell’oscurità, Un piccolo mammifero nella mia verità.
3) Nella notte mi senti cantare, Con occhi grandi posso guardare.
4) Faccio il sonnellino durante la lunga stagione. Amo miele e pesce, sono un buon pescatore!

Per individuare la risposta corretta, occorre trascinare ciascun animale sulla macchina. Se la macchina parte con l’animale vuol dire che la risposta è corretta, altrimenti la macchina cambia colore e l’animale ritorna in posizione.

Ecco una possibile implementazione del gioco indovinelli con Scratch:

Numeri amicabili in C++

Numeri amicabili in C++

In questa lezione realizzeremo un algoritmo sui numeri amicabili in C++, ovvero quei due numeri per i quali la somma dei divisori propri dell’uno è uguale all’altro e viceversa.

Per divisori propri si intendono tutti i divisori tranne il numero stesso.

Facciamo un esempio di numeri amicabili, considerando i numeri 220 e 284.

Il numero 220 ha come divisori propri: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 e 110.

Se sommiamo questi divisori otteniamo il numero 284.

Allo stesso modo, prendiamo il numero 284, questo ha come divisori: 1, 2, 4, 71, 142. Sommandoli otteniamo il numero 220.

Ecco dunque che i numeri 220 e 284 sono amicabili

Algoritmo per i numeri amicabili in C++

Prendere in input due numeri e visualizzare sullo schermo se sono amicabili.

Innanzitutto dichiariamo le variabili che ci servono:

a, b – Sono le due variabili intere che indicano i numeri per cui vogliamo verificare l’ipotesi iniziale.

div – Rappresenta il divisore che, partendo da 1, verrà incrementato opportunamente all’interno dei cicli.

s – Rappresenta la variabile che contiene la somma dei divisori.

Dopo aver dichiarato le variabili, chiediamo all’utente di inserirle in input, poi impostiamo il div a 1 e la somma a 0 (ciò si poteva fare anche prima).

Impostiamo nel ciclo while la condizione che div sia minore o uguale al primo numero. Dunque, finché questa condizione è vera, troviamo tutti i divisori di un numero e li sommiamo nella variabile s.

Dopo controlliamo se la somma così ottenuta è uguale al primo numero.

Se ciò è verificato allora procediamo a trovare i divisori del secondo numero e confrontiamo se la loro somma è uguale al primo numero.

Solo se questa condizione è verificata allora i due numeri sono amicabili.

Ecco dunque il codice completo che rappresenta l’algoritmo sui numeri amicabili in C++:

#include <iostream>
using namespace std;

int main() {
    int a, b, div, s;

    cout << "Inserisci un numero: ";
    cin >> a;
    cout << "Inserisci il secondo numero: ";
    cin >> b;

    div = 1;
    s = 0;

    while (div <= a / 2) {
        if (a % div == 0) {
            s += div;
        }
        div++;
    }

    if (s == b) {
        div = 1;
        s = 0;
        while (div <= b / 2) {
            if (b % div == 0) {
                s += div;
            }
            div++;
        }
        if (s == a) {
            cout << "I due numeri sono amicabili";
        } else {
            cout << "I numeri non sono amicabili";
        }
    } else {
        cout << "I numeri non sono amicabili";
    }

    return 0;
}

Chiaramente si poteva procedere in altri modi per trovare la soluzione all’algoritmo sui numeri amicabili in C++, proponete pure la vostra nei commenti sotto.

Alcuni link utili

Indice argomenti linguaggio C++

1- Introduzione al linguaggio C++

2- Variabili in C++

3- Operatori di assegnazione in C++

4- Esempi in C++

5- Casting in C++

Successione di Fibonacci in C++

Numeri amicabili in Python

Numeri amicabili in Python

In questa lezione realizzeremo un programma sui numeri amicabili in Python, al fine di esercitarci con le strutture iterative.

Ricordiamo che due numeri si dicono amicabili se la somma dei divisori propri di uno, escluso però il numero stesso, è uguale all’altro numero e viceversa.

Ad esempio i numeri 220 e 284 sono amicabili.

Infatti i divisori di 220 sono 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 e 110. La loro somma mi dà 284.

Allo stesso modo troviamo i divisori di 284: 1, 2, 4, 71, 142 la cui somma fa 220.

Quindi i numeri sono amicabili.

L’algoritmo risolutivo consiste dunque nel trovare tutti i divisori del primo numero, escluso il numero stesso, sommarli e confrontarli con l’altro numero. Allo stesso modo con il secondo numero.

Numeri amicabili in Python

Quindi innanzitutto prendiamo in input i due numeri interi e li memorizziamo in due variabili numero1 e numero2. Dopo inizializziamo le variabili div, somma1 e somma2.

La variabile div rappresenta il divisore e viene inizializzata ad 1 all’inizio e dopo il primo while, perché ci servirà per l’altro numero. In alternativa si poteva utilizzare un’altra variabile.

Dopo con il ciclo while troviamo tutti i divisori del numero1 e li sommiamo nella variabile somma1. Lo stesso per l’altro numero per cui sommiamo i divisori nella variabile somma2.

Infine compariamo somma1 con numero2 e somma2 con numero1. Se entrambe le uguaglianze sono verificate allora i numeri sono amicabili, altrimenti non lo sono.

Ecco dunque il codice completo dell’algoritmo sui numeri amicabili in Python:

numero1 = int(input('Inserire il primo numero: '))
numero2 = int(input('Inserire il secondo numero: '))

div, somma1, somma2 = 1, 0, 0

while div <= numero1 / 2:
    if numero1 % div == 0:
        somma1 += div
    div += 1

div = 1  # Riportiamo il divisore ad 1

while div <= numero2 / 2:
    if numero2 % div == 0:
        somma2 += div
    div += 1

if somma1 == numero2 and somma2 == numero1:
    print('I numeri sono amicabili!')
else:
    print('I numeri non sono amicabili!')

La stessa soluzione si può ottenere con i ciclo for:

numero1 = int(input('Inserire il primo numero: '))
numero2 = int(input('Inserire il secondo numero: '))

somma_divisori_1 = 0
somma_divisori_2 = 0

# Calcolo la somma dei divisori propri per il primo numero
for div1 in range(1, numero1 // 2 + 1):
    if numero1 % div1 == 0:
        somma_divisori_1 += div1

# Calcolo la somma dei divisori propri per il secondo numero
for div2 in range(1, numero2 // 2 + 1):
    if numero2 % div2 == 0:
        somma_divisori_2 += div2

# Verifico se i numeri sono amicabili
if somma_divisori_1 == numero2 and somma_divisori_2 == numero1:
    print('I numeri sono amicabili!')
else:
    print('I numeri non sono amicabili!')

Potremmo aggiungere un controllo, perché in effetti è inutile trovare tutti i divisori del secondo numero, se somma1 è diverso da numero2.

Quindi sarebbe opportuno trovare i divisori del secondo numero solo se la condizione somma1 uguale a numero2 è soddisfatta.

Lo stesso algoritmo lo abbiamo realizzato con algobuild: numeri amicabili con Algobuild.

Ottimizzazioni numeri amicabili in Python

Possiamo ottimizzare l’algoritmo precedente utilizzandoo le “generator expressions” per calcolare la somma dei divisori propri di ciascun numero, rendendo il codice più compatto. Sostituiamo i cicli for con l’utilizzo della funzione sum, che è più efficiente.

Migliora le tue capacità di programmazione Python seguendo i nostri corsi in diretta!

corsi Python

Ecco di seguito il codice ottimizzato:

numero1 = int(input('Inserire il primo numero: '))
numero2 = int(input('Inserire il secondo numero: '))

# Calcolo la somma dei divisori propri per il primo numero
somma_divisori_1 = sum(div1 for div1 in range(1, numero1 // 2 + 1) if numero1 % div1 == 0)

# Calcolo la somma dei divisori propri per il secondo numero
somma_divisori_2 = sum(div2 for div2 in range(1, numero2 // 2 + 1) if numero2 % div2 == 0)

# Verifico se i numeri sono amicabili
if somma_divisori_1 == numero2 and somma_divisori_2 == numero1:
    print('I numeri sono amicabili!')
else:
    print('I numeri non sono amicabili!')

Questa versione ottimizzata riduce il codice e migliora l’efficienza usando espressioni generator e la funzione sum() per il calcolo delle somme dei divisori, evitando cicli for espliciti.

Conclusioni

In questa lezione abbiamo esaminato come implementare un programma in Python per verificare se due numeri sono amicabili, ovvero se la somma dei divisori propri di ciascun numero corrisponde all’altro numero. Abbiamo analizzato diversi approcci per implementare questo programma, ciascuno con i propri vantaggi e considerazioni.

Il primo approccio utilizzava cicli while e variabili per controllare i divisori dei numeri inseriti. Successivamente, ho realizzato la stessa soluzione, sostituendo i cicli while con cicli for, eliminando le variabili non necessarie.

Successivamente, ho proposto una versione ottimizzata utilizzando le espressioni generator e la funzione sum() per ridurre ulteriormente la complessità del codice.

Chiaramente questi sono solo dei possibili modi per implementare l’algoritmo sui numeri amicabili in Python. Ci sono molteplici modi per implementare l’algoritmo per verificare i numeri amicabili in Python, e ognuno può avere vantaggi e svantaggi a seconda del contesto e delle preferenze personali.

Miglioramenti e ottimizzazioni

Ecco alcuni punti da prendere in considerazione:

  1. Approccio Iterativo vs. Approccio Funzionale: Nel nostro esempio, abbiamo utilizzato un approccio iterativo con cicli while e for, ma è possibile implementare lo stesso algoritmo utilizzando un approccio più funzionale con le funzioni built-in di Python come filter() e sum(). Questo potrebbe rendere il codice più compatto e leggibile per alcuni programmatori.
  2. Ottimizzazione degli Algoritmi: Esistono diverse strategie per ottimizzare l’algoritmo per verificare i numeri amicabili. Ad esempio, è possibile limitare il range dei divisori da controllare, in quanto i divisori propri di un numero non possono essere mai superiori alla sua metà. Questo può ridurre il numero di iterazioni e rendere l’algoritmo più efficiente, soprattutto per numeri grandi.
  3. Uso di Funzioni: Abbiamo introdotto una versione che utilizzava una funzione separata per calcolare la somma dei divisori di un numero. Questo rende il codice più modulare e favorisce il riutilizzo del codice. Tuttavia, in alcuni casi, l’uso di funzioni può aggiungere complessità non necessaria, quindi è importante valutare se è realmente vantaggioso.
  4. Gestione dei Numeri Negativi o Nulli: Nel nostro esempio, abbiamo supposto che gli utenti inseriscano numeri positivi, ma potrebbe essere necessario gestire anche numeri negativi o nulli, a seconda dei requisiti dell’applicazione.

È importante scegliere l’approccio che meglio si adatta alle esigenze specifiche del progetto, tenendo conto di considerazioni come leggibilità, efficienza e manutenibilità del codice. La discussione e il confronto di diversi approcci possono portare a una migliore comprensione dell’algoritmo e delle sue implementazioni in Python, perciò scrivete nei commenti sotto e dite la vostra!

Alcuni link utili

Indice tutorial sul linguaggio Python

1 – Introduzione al linguaggio Python

2 – Le variabili

3 – Operatori aritmetici e di assegnazione

4 – Stringhe

5 – Casting

6 – Input e print

7 – Primi esercizi in Python

8 – Errori in Python

9 – Script Python

10 – Scambio di variabili

Numeri amicabili con Algobuild

Numeri amicabili con Algobuild

Sviluppiamo un algoritmo con Algobuild che calcoli se due numeri sono amicabili.

Definizione di numeri amicabili

Due numeri in matematica si dicono amicabili o amicali o amici se la somma dei divisori propri di uno (escluso il numero stesso) è uguale all’altro numero e viceversa.

Facciamo un esempio:

La coppia di numeri 220 e 284 sono amicabili.

Infatti i divisori di 220 sono: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 e 110.
Se li sommiamo otteniamo il numero 284

Allo stesso modo i divisori di 284 sono: 1, 2, 4, 71, 142.
La somma di tutti i divisori fa 220.

Quindi si dice che i numeri sono amicabili.

Ci sono altri esempi di numeri amicabili, ad esempio 1184 e 1210 oppure 2620 e 2924, ecc…

Algoritmo che calcola se due numeri sono amicabili con Algobuild

Per realizzare l’algoritmo prendiamo in input A e B, che rappresentano i due numeri presi in input su cui fare il controllo per vedere se sono amicabili.

Impostiamo una variabile div, che rappresenta i divisori, e la facciamo partire da 2.

Facciamo partire div da 2 poiché è scontato che qualsiasi numero si possa dividere per 1, pertanto faccio senza a farlo, risparmio operazioni.

Facciamo poi partire la somma dei due divisori direttamente da 1 anziché da zero.

Quindi poniamo sommaA=1 e sommaB=1.

Successivamente finché il divisore non raggiunge A/2, continuiamo a dividere A per il divisore.

Se il resto della divisione di A diviso div (A%div) è uguale a zero allora div sarà sicuramente divisore, e lo sommiamo alla sommaA; altrimenti lo ignoriamo e andiamo avanti.

In ogni caso si incrementerà il contatore div di uno.

Perché ci fermiamo ad A/2?

Perché è scontato che se dividiamo un numero per un numero superiore alla sua metà avremo sempre resto diverso da zero; ovvero sarà sempre un numero con la virgola. Quindi risparmieremo tante operazioni se ci fermiamo ad A/2.

Lo stesso procedimento possiamo ripeterlo per B, avendo cura di portare il div nuovamente a due una volta che terminiamo con A.

Alla fine confrontiamo la sommaA con B e la sommaB con A. Se entrambi i risultati sono veri allora i numeri sono amicabili, altrimenti no.

numeri amicabili con Algobuild

Alcuni link utili

Indice argomenti diagramma a blocchi

Numeri primi da 1 a 100

Array con algobuild

Divisori di un numero con algobuild

Algoritmi di selezione sugli angoli

Algoritmi di selezione

Triangoli con algobuild

Fibonacci con algobuild

Serie buffa con algobuild

Numeri amicabili con algobuild

Numeri perfetti con algobuild

Massimo fra tre numeri

Minore fra tre numeri