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.

Controllo ciclo da 2 a n

Auron (15880 points)
51 126 194
in Es1 by (15.9k points)
Salve a tutti, sto cercando alcuni "trucchetti" che permettano di abbassare drasticamente la velocità d'esecuzione del primo esercizio del primo homework... Ho pensato di fare un check sulla parità dei numeri di cui controllare i divisori, prima di tutto, in modo da saltare una buona metà dei controlli... ma, così facendo, il mio pc che ha un quad-core di tutto rispetto anche se non al top, impiega comunque meno di 9 secondi per restituirmi gli output risultanti dall'inserimento degli input di entità "media"... qualche idea su come velocizzare?
764 views
closed

4 Answers

Best answer
francesco.dev (33560 points)
23 51 129
by (33.6k points)
selected by
Allora, ci sono moltissimi modi per diminuire drasticamente l'esecuzione del tuo programma.
Tra i vari te ne consiglio uno che ho consigliato anche in un'altra domanda: devi analizzare per prima cosa il problema matematico che hai davanti!
Perché stilare direttamente una soluzione che faccia quello che ci chiede la traccia senza valutare l'aspetto matematico della stessa, risulterà tanto semplice quanto sarà enorme il tempo di esecuzione che richiederà.
- Francesco Pio Scognamiglio
Auron (15880 points)
51 126 194
by (15.9k points)
Secondo voi un'esecuzione di 4 secondi sul problema con numeri "grandi" può essere soddisfacente?
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Penso proprio di sì, rientri perfettamente nel limite dei 30 secondi.
Auron (15880 points)
51 126 194
by (15.9k points)
Si si, sapevo del limite... Chiedevo se secondo voi è abbastanza competitivo per concorrere per i famosi 2 punti in più :)
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Credo di sì, comunque sarà tutto molto più chiaro quando il professore li correggerà!
Auron (15880 points)
51 126 194
by (15.9k points)
Ti ringrazio!
francesco.dev (33560 points)
23 51 129
by (33.6k points)
Di niente!
Sempre disponibile per dare una mano :)
restante.giuseppe (2480 points)
7 32 49
by (2.5k points)
ci sarebbe un'altro controllo che potresti fare, abbasserebbe drasticamente il tempo di esecuzione
F
FilippoMazzara (360 points)
0 4 9
by (360 points)

pultroppo non posso essere esplicito però sappi che ci sono vari modi di procedere, tutti incidono in maniera diversa sul tempo di esecuzione ma si basano tutti sul principio di ridurre la dimensione dell'input che tu dai alla funzione. Infatti un ciclo for che scorre un input di dimensione n avrà complessità n, due cicli for annidati ne avranno n^2 (stesso vale per il while). Ora puoi decidere se operare sul numero di cicli nel tuo codice, direttamente sul valore in input, in modo progressivo riducendo l'input man mano che la funzione procede oppure scomponendo la tua funzione in funzioni più piccole

andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
Non puoi controllare "solo" i dispari.

Ad esempi i divisori di 2^n sono tutti pari
Auron (15880 points)
51 126 194
by (15.9k points)
Forse mi sono spiegato male prof... Ho previsto un controllo per sapere se un numero è pari o meno... Se non è così faccio partire il ciclo da 3 con spostamenti di due posizioni per volta, proprio perchè non è possibile che un n dispari abbia divisori pari :)
andrea.sterbini (207940 points)
756 1270 2377
by (208k points)
fico!                                               .