Divisori di un numero

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)