Per prima cosa:
- Codice: Seleziona tutto
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):
- Codice: Seleziona tutto
#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).