Dimostrazione lollatz

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?

Grazie in anticipo,
dp_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.

Se non è un problema (mi rivolgo agli admin) posso mandarti il link del file che ho scritto

arna1998

No problem

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.

Si hai ragione…

Correggo subito e ne approfitto per dire che se trovate altri errori, imprecisioni o altro che non va, segnalatemelo così lo metto a posto.

Grazie mille per la spiegazione! :slight_smile:

1 Mi Piace