Newsgroup: it.comp.lang.c
Titolo: Problema sulla ricorsione

Salve sono alle prime armi con la programmazione in C, potreste per favore
aiutarmi a risolvere questo problema: "Scrivere una funzione che prenda un
valore intero e lo restituisca dopo aver invertito le sue cifre (Bisogna
utilizzare la ricorsione). Per esempio, dato il numero 7631, la funzione
dovrà restituire 1367.
Grazie a chi saprà aiutarmi!!

 si avvicino` a me, e solennemente disse: 

<CODE>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *invertstring(char *string) {
        char *retstr;
        retstr=malloc(strlen(string)+1);
        if (strlen(string)==0)
                sprintf(retstr,'\0');
        else {
                char tmp;
                tmp=string[strlen(string)-1];
                string[strlen(string)-1]='\0';
                sprintf(retstr,"%c%s",tmp,invertstring(string)); }
        return retstr; }
int main(int argc,char *argv[]) {
        char *n;
        n=strdup(argv[1]);
        printf("%d\n",atoi(invertstring(n)));
        return 0; }
</CODE>
..non e` ottimizzata, manca la gestione degli errori, ma sostanzialmente e`
quello che ti serviva. Per ulteriori ragguagli, vedi le varie manpages e i primi
capitoli del K&R.
La sintassi e`:
	$ ./a.out stringa_da_invertire
Se vuoi che prenda in input un intero e non una stringa, puoi usare la stessa
funzione convertendo in stringa l'intero che passi alla funzione (itoa() - ma
dovrai scriverla tu).
Adieu,
-- 
Lestat de Lioncourt                               |          Ciro Mattia Gonano
  JabberID: 
les...@jabber.students.cs.unibo.it
    |    Undergraduate Student in
  ICQ#: 52631406                                  |         Computer Science at
  URL: 
http://www.CS.UniBO.It/~gonano
             |       University of Bologna
            <powered by Linux Slackware 8.1 on Kernel 2.4.18-xfs>

 (Bisogna utilizzare la ricorsione).
Secondo me il problema č mal posto. Se l'intero che passi alla funzione č
1750, cosa deve restituire? 0571 o 571? Secondo me la funzione deve
restituire una stringa contenente le cifre invertite.
    char *invertinumero(int n, char *result) {
        char segno[2] = "\0";
        int x = abs(n) / 10;
        int y = abs(n) % 10;
        char risultato[20];
        if (n < 0)
        strcpy(segno, "-");
        if (x != 0) {
            sprintf(risultato, "%s%d%s", segno, y, invertinumero(x,
result));
            return strcpy(result, risultato);
        }
        sprintf(result, "%s%d", segno, y);
        return result;
    }
    int main(void) {
        int n = -7601;
        char risultato[20];
        printf("numero = %d, invertito = %s\n", n, invertinumero(n,
risultato));
        return 0;
    }
Maurizio.

 ha scritto nel messaggio:

questo senza utilizzare le stringhe, ma solo numeri...
non so se e' la soluzione ottimale...
PS: se gli dai un numero che finisce con qualche 0,
ovvio che l'inverso non lo conterra': 10000-->1
#include <math.h>
int f(int num){
    int len = 1+static_cast<int>(log10(num));
        if(len==1) return num;
        else{
            int unita=num%10;
            return unita*pow(10,len-1)+f(static_cast<int>(num/10));
        }
}
--
Ciao by Allanon
"The programmer, like the poet, works only slightly removed from pure
thought-stuff. He (or she!) builds his castles in the air, creating by
exertion of the imagination. Few media of creation are so flexible, so easy
to polish and rework, so readily capable of realizing grand conceptual
structures."
              -- Fred Brooks (The Mytical Man Month)

 }
In C esiste un solo tipo di cast:
cast-expression:
        unary-expression
        ( type-name ) cast-expression
Quelli che usi sono operatori di cast  del C++ (e in C++ avresti incluso
<cmath> ed usato std::log10 e std::pow).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Chi parla in tono cortese, ma continua a prepararsi, potra` andare avanti;
 chi parla in tono bellicoso e avanza rapidamente dovra` ritirarsi" 
Sun Tzu -- L'arte della guerra

 Kronos
sorry, ho fatto un po' di casino! ;-)
cmq il prgm dovrebbe funzionare... 
-- 
Ciao by Allanon