Ciao a tutti, ho provato a risolvere il problema lollatz (banale!) e la mia soluzione, nonostante faccia 100/100, non mi convince. Nel testo dice di stamoare -1 se il problema non ha soluzione, cioè se si torna sullo stesso numero più di una volta. Nella mia soluzione però non eseguo questo controllo, riducendo il mio codice a questo:
while((N % 10) != 0) { int cifra = N % 10; N *= (cifra - 1); N /= 2; } printf(“%d”, N);
Dato che, come ho detto prima, questo codice totalizza 100/100, c’è una dimostrazione che possa spiegare perchè non serve mai stampare -1?
io sto partecipando alla scrittura delle soluzioni dei problemi della gara a squadre, e questo problema è stato assegnato a me, quindi ho già affrontato il problema di dimostrare che si arriva sempre ad una soluzione e che questo avviene nei limiti di tempo del problema.
Ragiona su N mod 10, sapendo che N è un quadrato perfetto, e vedrai che si trova sempre una soluzione in pochi passaggi (mi pare 3 al massimo) per tutti i casi.
Se non è un problema (mi rivolgo agli admin) posso mandarti il link del file che ho scritto oppure copia-incollare una parte di soluzione, intanto prova a vedere se riesci a concludere da solo.
Ecco qui il pdf dove è spiegato tutto: https://www.sharelatex.com/project/54fd5017841802fb0b637b1b/output/output.pdf?cache_bust=1427474320885&compileGroup=standard&build=14c5c198d45
Piccola osservazione: non è vero che se l’ultima cifra di N è 4 allora moltiplicando per 3 e dividendo per 2 ottieni un numero con ultima cifra 6 (provare, per credere, N=14); questo deriva dal fatto che 2 non ha inverso modulo 10, quindi non puoi sapere in modo univoco cosa uscirà dividendo qualcosa per 2. Questo ad ogni modo non inficia la bontà della soluzione, dato che anche il caso (N%10)==1 è già stato discusso.