/* Calcola ricorsivamente l'intero corrispondente all'inversione di n.
 * Introduciamo una variabile statica: moltiplicatore.
 * Cerchiamo di rispettare questa proprieta':
 * alla chiusura della chiamata ricorsiva inverti(n),
 * moltiplicatore contiene la potenza di 10
 * corrispondente alle cifre di n.
 * Esempio:
 * dopo la chiamata inverti(145), moltiplicatore vale 100.
 * dopo la chiamata inverti(4), moltiplicatore vale 1.
 */
int inverti (int n) {
    static int moltiplicatore = 1;
    int ultima_cifra; // ultima cifra di n
    int prima_parte;  // prime cifre di n tranne l'ultima
    int prima_parte_invertita; // valore di prima_parte invertita

    if (n < 10) // isoliamo il caso a una cifra
        return n;

    else { // passo ricorsivo: almeno due cifre
        ultima_cifra = n % 10;
        prima_parte = n / 10;
        prima_parte_invertita = inverti(prima_parte);

        // Dopo la chiamata di inverti(prima_parte)
        // moltiplicatore rappresenta la potenza di 10
        // corrispondente alle cifre di prima_parte
        moltiplicatore *= 10;

        // Ora moltiplicatore rappresenta la potenza di 10
        // corrispondente alle cifre di n.
        // Lo sfruttiamo per mettere ultima_cifra in testa al valore di ritorno
        return ultima_cifra * moltiplicatore + prima_parte_invertita;
    }
}
Beispiel #2
0
int main()
{
    char stringa[20];
    int i;
    struct lista *inizio=NULL;

    printf("Inserisci la stringa: ");
    scanf("%s",stringa);
    
    for(i=0; i < strlen(stringa); i++)
        inizio = ins_coda(inizio,stringa[i]);

    printf("h->");
    stampa(inizio);
    printf("NULL\n");

    inizio = inverti(inizio);
    
    printf("h->");
    stampa(inizio);
    puts("NULL");
    
    return 0;
}
int main(void) {
    int numero = leggi();
    printf("%d\n", inverti(numero));
    return 0;
}