Problema programma C

Ener2
Scrivere una funzione ricorsiva taglio che dati due numeri interi n, m, restituisca il numero n senza le m cifre più a sinistra; ad esempio taglio( 467232, 2 ) dovrà restituire 7232.
La mia idea era quella di dividere n per 10 fino a quando il suo resto non fosse proprio n e contemporaneamente utilizzare un contatore che incrementasse ad ogni divisione per 10. Dopo di che avrei sottratto m al contatore ottenendo l'esponente da dare alla base 10 che avrei poi utilizzato per dividere di nuovo n, e di nuovo calcolato il resto che a quel punto sarebbe stata la soluzione del problema. Per farla breve, 467232 / 10000 = 46 col resto di 7232. Ovviamente vi sottopongo questo problema perché non so come tradurlo il codice C. Ho allegato il codice che avevo provato ma non funzionava.
#include <stdio.h>
#include <stdlib.h>
int taglia( int n, int m )
{
    int k;
    int ex;
    int d = pow( ex, 10 );
    int r;
    for( ex = 0; d = n; ex++ )
    {
         k = n / d;
         return k;
         }        
    do
    {
         r = n % d;
         } while( r == n );
}
int main()
{
    int n, m;
    printf( "--> n: " );
    scanf( "%d", &n );
    printf( "--> m: " );
    scanf( "%d", &m );
    
    printf( "--> %d\n", taglia( n, m ) );
    
    system( "pause" );
    return 0;
}

Risposte
apatriarca
Per prima cosa:
int d = pow( ex, 10 );

utilizza ex senza inizializzarlo. Inoltre, l'esercizio richiede che si faccia uso di una funzione ricorsiva. La tua idea non è comunque molto semplice da implementare in modo ricorsivo (o almeno sarebbe necessario usare diverse funzioni ricorsive in sequenza).

Il metodo classico per estrarre le cifre di un numero in una qualche base è quella di continuare a dividere per la base e di memorizzare il resto della divisione finché il numero non sia zero. In questo modo le cifre vengono estratte in ordine inverso, dalla meno significativa alla più significativa. Per cui, partendo da 467232 si ottiene la seguente successione di valori: (467232, []) -> (46723, [2]) -> (4672. [3, 2]) -> (467, [2, 3, 2]) -> (46, [7, 2, 3, 2]) -> (4, [6, 7, 2, 3, 2]) -> (0, [4, 6, 7, 2, 3, 4]). Il seguente codice utilizza questo procedimento per stampare un numero in una qualche base (utilizza un array statico in modo da stampare A, B, C.. quando le cifre sono più alte di 9):
#include <stdio.h>

void print_uint_ric(unsigned long n, unsigned char b, const char * digits)
{
    if (n == 0) return;

    const unsigned long d = n / b;
    const unsigned long r = n % b;

    print_uint_ric(d, b, digits);

    putchar(digits[r]);
}

void print_uint(unsigned long n, unsigned char b)
{
    static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const unsigned digits_size = sizeof(digits)/sizeof(const char);

    if (b >= digits_size) {
        fprintf(stderr, "print_uint error: the base b must be lower than %u."
                " Base passed: %u.", digits_size, b);
        return;
    }

    if (n > 0) {
        print_uint_ric(n, b, digits);
        putchar('\n');
    } else {
        puts("0");
    }
}

int main(void)
{
    const unsigned long n = 1+4+16+32;
    unsigned char b = 2;

    for (b = 2; b <= 32; b <<= 1) {
        print_uint(n, b);
    }

    return 0;
}

Spero che l'idea sia chiara perché il tuo programma è strettamente legato a questo problema. Supponi ora di passare anche \(m\) a questa funzione e di restituire un nuovo valore di \(m\) in modo che il nuovo \(m\) restituito sia uguale al valore restituito dalla funzione richiamata al suo interno meno 1 e di stampare solo se il valore di \(m\) restituito dalla chiamata ricorsiva sia minore o uguale a 0. Ti invito a dimostrare che questa semplice idea è sufficiente per risolvere il tuo problema (ovviamente con le dovute modifiche per restituire il valore invece che stamparlo e specializzando il codice per utilizzare la base 10. Alternativamente, puoi fermarti nella ricorsione quando \(n < 10^m\) (personalmente non calcolerei questo numero usando pow ma è una preferenza personale).

Ener2
Ti ringrazio moltissimo sono riuscito a risolvere il mio problema !!!!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.