Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Per partecipare al corso di Fondamenti di programmazione 2023-24 loggatevi e attivatelo nella vostra pagina dei corsi preferiti. A quel punto il corso appare nel menù personale cliccando sul proprio avatar. Per i materiali degli anni precedenti seguite lo stesso metodo.

To join the Programming/Lab 2023-24 course, log-on and select it on the my courses page. It will appear on the personal menu of your avatar. For earlier years use the same method.

Tempo di esecuzione maggiore ai 30 secondi

A
Alice Errera (640 points)
8 11 19
in Es1 by (640 points)
closed by

Ho scritto il codice del primo programma e funziona. Il problema è che non riesce a terminare entro i 30 secondi stabiliti dall'esercizio e il mio computer si surriscalda. Quanti di voi hanno questo problema e come siete riusciti a risolverlo?

1.2k views
closed with the note: consegna passata

7 Answers

LeonardoEmili (35740 points)
13 65 155
by (35.7k points)

Ciao Alice!
Come sai non possiamo scrivere codice all'interno del forum. Tuttavia posso rassicurarti perché tale comportamento è normale con calcoli molto complessi. Chiaramente questo non deve succedere con numeri piccoli come quelli d'esempio del testo dell'esercizio.

Ti vorrei proporre un consiglio, prova a pensare a questo. Il computer come specificato dal professore non ha "occhio" per capire i problemi come invece facciamo noi. D'altronde il suo punto forte è l'incredibile velocità di calcolo che esso possiede! Con numeri molto grandi il computer magari impiegherà tempo per eseguire un calcolo ma certamente lo farà! 

Ora, a meno che tu non lavori su un computer davvero datato ti trovi in una situazione in cui stai dando all'elaboratore davvero TROPPI dati da calcolare, che ti ripeto farà ma a suo tempo. E se trovassi una o più tecniche per far eseguire al pc meno calcoli? Ricordati che è un problema di matematica quindi considera anche l'idea di dare un'occhiata ai criteri di divisibilità e altri concetti legati al problema. Vedrai che tu stessa arriverai alla soluzione con ottimi risultati!

Spero sinceramente di averti aiutato

Buon code!!

Leonardo Emili

split (8700 points)
21 59 79
by (8.7k points)
sì, quoto decismente la parte "ricordati che è un problema di matematica", capire quali calcoli far fare, e quali no, riduce "abbestia" tempo e problemi
c
czarbo2 (2400 points)
4 9 15
by (2.4k points)
Ciao!
Anche io ho lo stesso problema, con la sola differenza (di tempo) tra i 3 test proposti: il primo lo finisce all'istante, il secondo ci impiega qualche secondo, il terzo "ok" non riesco a ottenerlo :( .

Quali parti del codice dovrei modificare, per rendere il test più veloce?

Grazie in anticipo!
CZ
split (8700 points)
21 59 79
by (8.7k points)
detta così è un po' generica,  sai dirci di più sul tipo di operazioni che compie? prova  mettere dei "print strategici" alla fine di alcuni cicli, per vedere quale di questi è più lento magari, e correggerlo se puoi.

all'inizio io l'ho risolto con una funzione ricorsiva, ma facendo i test mi dava un errore di "esaurimento di memoria" o qualcosa del genere, per cui risolveva la prima lista con numeri piccoli ma le altre davano questo errore. non so se hai usato le funzioni ricorsive, ma se lo hai fatto in rete tutti lo sconsigliano in python, non so perché ma dicono che in python è meglio fare i cicli. C'è una sorta di controllo che arresta il programma per evitare lo stack overflow, c'è un limite che si può alzare, ma tutti lo sconsigliano. questo solo per dire che se hai usato funzioni ricorsive forse è meglio fare cicli.
gianpcr (4620 points)
5 16 34
by (4.6k points)
Ciao Alice, il problema avviene sicuramente perchè con numeri molto alti la quantità iterazioni necessarie a calcolare i divisori propri aumenta. Il mio consiglio è di calcolarti il numero di divisori tramite la scomposizione in fattori primi.
francesco.dev (33560 points)
21 51 129
by (33.6k points)
Ciao Alice!
Se ciò accade devi cambiare approccio al problema, creando una nuova soluzione!
Perché se il professore ha messo questo limite, evidentemente ci sono diverse soluzioni ed approcci che ti permetterebbero di non sforare il limite di tempo.

- Francesco Pio Scognamiglio
Luca T. (5410 points)
3 20 38
by (5.4k points)
Il fatto che il tuo computer si surriscalda implica due cose:

- o il computer è veramente datato;

- o stai facendo fare al computer molto più lavoro del dovuto.

Prova a ragionare su quanti e quali numeri è necessario controllare per trovare i divisori prima di interrompere il ciclo e prendere le dovute decisioni, senza scorrerli tutti.
Auron (15880 points)
50 126 194
by (15.9k points)

Occhio a non riformulare domande già fatte, altrimenti il forum si "intasa" sempre delle stesse cose, quando magari un problema è stato già risolto o delle risposte sono già state date... In ogni caso non faccio io da moderatore, quindi ti posto quello che ho risposto a chi, prima di te, ha posto la stessa domanda :D

Ecco qui:

Probabilmente hai impostato un ciclo che si ripete n volte che controlla se n sia divisibile per l'indice del ciclo... Ora, per numeri medi e piccoli, la macchina ti sostiene (in maniera più o meno accettabile)... Ma tu immagina, per i numeri grandi, di essere nell'ordine di 50/60 miliardi... Ecco, adesso immagina che tu stai chiedendo computer di gestire un ciclo che viene ripetuto 60 miliardi di volte per il numero 6437635961, più 50 miliardi di volte per il numero 5311430407... e così via... Puoi capire da te che se la macchina potesse parlare ti direbbe "Amico mio, io te lo faccio questo conto, ma mi prendo il tempo che mi serve"... che non è poco... L'unica cosa da fare è prevedere dei controlli aggiuntivi che ti permettano di ridurre il numero di cicli e/o di numeri da controllare, in modo da abbassare drasticamente il tempo di esecuzione...

Consiglio: Una delle possibilità è quella di poter dimezzare il tempo di esecuzione per ben due volte, con due controlli diversi (puoi trovare più informazioni su un altro mio post in questo forum... e già il fatto di "dimezzare" dovrebbe farti avere qualche idea)...

Ma questo è solo uno dei controlli, io ne ho implementati anche altri... fai delle prove, divertiti a sperimentare e vedrai che scoprirai nuovi modi di vincere sulla macchina ;)

P
Pic1 (1030 points)
9 24 31
by (1.0k points)
Ciao Alice,

per aiutarti vorrei farti notare una cosa:

ciò che il programmatore fa, a mio parere (magari il prof mi correggerà), è rispondere alle specifiche chieste dal cliente (in questo caso il prof).

Detto questo,

sei sicura di star trovando una soluzione al problema richiesto? O, forse, stai cercando di risolvere un problema più ampio?

L'esercizio chiede di eliminare tutti i numeri aventi più di k divisori... ma non è che tu stai facendo cercare al computer TUTTI i divisori del numero (per poi vedere se sono maggiori di k)?

In pratica, una volta trovati k+1 divisori, non c'è bisogno di trovarne altri... ciò ti permette di ridurre drasticamente i tempi per quei numeri (non primi) molto grandi.

Inoltre (anche se già altri hanno risposto in tal senso) il minimo divisore intero di un numero intero n è 2, quindi ne consegue che il divisore più grande che possa avere è n/2.

Spero di esserti stato utile.

Ferdinando Picone
Stefaniscion (1370 points)
6 15 32
by (1.4k points)
Bella risposta! A leggerla prima mi sarei tolto la fatica di arrivarci da solo