Decrescita programmata

Matematica Senza Frontiere – 10/02/2015

Annamaria si diverte con le successioni numeriche.
Sceglie un numero intero naturale come primo numero della successione; calcola il successivo moltiplicando tra loro le cifre del numero.
Procede analogamente con il numero ottenuto finché non ottiene un numero con una sola cifra.
Ad esempio, iniziando da 68, ottiene la successione di quattro numeri 68, 48, 32, 6.

Quale numero intero naturale inferiore a 100 comporta, seguendo il procedimento descritto, la successione più lunga?

Vedi la discussione

Soluzione 1

Scrivi un programma che visualizza tutte le sequenze per i numeri da 1 a 99 e decidi guardando l’output

for n in range(1, 100):
    print("%2d:" %(n), end=" ")
    
    while(n >= 10):
        nd=n//10
        nu=n%10
        n =nd*nu
        print("%2d" %(n), end=" ")
        
    print()
_1: 
_2: 
--: --
68: 48 32 _6
--: --
77: 49 36 18 _8
--: --
98: 72 14 _4
99: 81 _8

Soluzione 2

Il codice è più leggibile con una funzione

def elabora(n):
    while(n >= 10):
        nd=n//10
        nu=n%10
        n =nd*nu
        print("%2d" %(n), end=" ")

for x in range(1, 100):
    print("%2d:" %(x), end=" ")
    elabora(x)
    print()
_1: 
_2: 
--: --
68: 48 32 _6
--: --
77: 49 36 18 _8
--: --
98: 72 14 _4
99: 81 _8

Soluzione 3

Scrivi un programma che decide qual è la sequenza più lunga

def lunghezza(n):
    lung=1
    while(n >= 10):
        lung += 1
        nd=n//10
        nu=n%10
        n =nd*nu
    return lung

lungMax=0
enneMax=0
for x in range(1,100):
    y=lunghezza(x)
    print("%2d -> %d" %(x,y))
    if(y > lungMax):
        lungMax=y
        enneMax=x

print("-------")
print(enneMax, "->", lungMax)
_1: 1
_2: 1
--: -
68: 4
--: -
77: 5
--: -
98: 4
99: 3
-------
77 -> 5

matplotlib

Osserva graficamente il numero di passi per tutti i numeri da 1 a 99

import matplotlib.pyplot as plt
 
def lunghezza(n):
    lung=1
    while(n >= 10):
        lung += 1
        nd=n//10
        nu=n%10
        n =nd*nu
    return lung

NUMERI=range(1, 100)
LUNGHEZZE=99*[0]
 
for n in NUMERI:
    LUNGHEZZE[n-1]=lunghezza(n)

plt.bar(NUMERI, LUNGHEZZE)
plt.grid()
plt.show()