Caricare in una lista i divisori di un numero (< 10.000) e visualizzarli.
Soluzione 1
La lista dei divisori nasce vuota e aumenta in lunghezza con append().
NUM = ...
divisori = []
for div in range(1, NUM+1):
if(NUM%div == 0):
divisori.append(div)
for x in divisori:
print(x, end=" ")
L’uso dinamico della memoria
- permette di diminuire lo spreco di memoria
- a scapito di un aumento del tempo di esecuzione del codice.
Soluzione 2
Una cella per ogni possibile divisore da 1 a NUM
...
divisori=(NUM+1)*[0] # NUM+1 zeri
#print(divisori)
for div in range(1, NUM+1):
if(NUM%div == 0):
divisori[div]=div
#print(divisori)
for x in divisori:
if(x != 0):
print(x, end=" ")
In alcuni casi i divisori sono molto pochi e la percentuale di riempimento della lista sarebbe bassissima.
Soluzione 3
Se si utilizza un indice per i divisori allora possono essere memorizzati adiacenti
...
divisori=NUM*[0]
conta=0
for div in range(1, NUM+1):
if(NUM%div == 0):
divisori[conta]=div
conta += 1
for i in range(conta):
print(divisori[i], end=" ")
Soluzione 4
Quanti possono essere i divisori per un numero minore di 10.000?
- NUM=2 –> 1, 2
- NUM=10 –> 1, 2, 5, 10
- NUM=20 –> 1, 2, 4, 5, 10, 20
- …
Non più di 100!
...
divisori=100*[0]
...
Soluzione 5
Con il codice seguente ottieni il numero di divisori per ognuno dei numeri minori di 10.000
def conta_divisori(numero):
conta=0
for div in range(1, numero+1):
if(numero%div == 0):
conta += 1
return conta
MAX=10000
for n in range(MAX):
print(n, conta_divisori(n))
Soluzione 6
Stampa la classifica dei 12 numeri minori di 10.000 con maggior numero di divisori
def conta_divisori(numero):
conta=0
for div in range(1, numero+1):
if(numero%div == 0):
conta += 1
return conta
MAX=10000
ELENCO=[]
for n in range(MAX):
x=conta_divisori(n)
ELENCO.append((x, n))
ELENCO.sort(reverse=True) # Ordina le "coppie" in modo decrescente
for i in range(12): # Visualizza le prime 12 "coppie"
print(ELENCO[i])
Eccola!
(64, 9240)
(64, 7560)
(60, 9360)
(60, 8400)
(60, 7920)
(60, 5040)
(56, 8640)
(56, 6720)
(54, 9900)
(54, 8820)
(54, 7200)
(54, 6300)