1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 4
    Points : 2
    Points
    2

    Par défaut Inversion des chiffres d'un entier

    Bonjour à tous !
    J'ai un exercice donné à mon cours d'algorithmique basé sur la récursivité. On me demande d'inverser les chiffres d'un nombre ( 1234 devient 4321). Je vois bien comment je dois le faire de manière itérative, mais je ne parviens vraiment pas à passer à une méthode récursive, j'ai beau essayer de jouer avec les modulos 10 et les divisions entière par 10, je n'arrive pas au bon résultat :/
    J'ai essayé une ébauche de code, je comprends pourquoi ca ne fonctionne pas, mais je n'arrive pas à en venir au bout :/ Je n'ai trouvé nul part sur le net une solution avec un algorithme itératif :/

    Mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include<stdio.h>
    #include<conio.h>
     
    int Inversion(int);
     
    int main(){
        int nbr, nbri;
     
        printf("Entrez un nombre a inverser : ");
        fflush(stdin);
        scanf("%d", &nbr);
     
        nbri=Inversion(nbr);
        printf("%d\t--->\t%d",nbr, nbri);
     
        getch();
     
        return 0;
    }
     
    int Inversion(int nb){
        int mod, div;
     
        mod=nb%10;
        div=nb/10;
     
        if(div!=0){
            return 10*Inversion(div)+mod;
        }else{
            return mod;
        }
    }
    Si vous avez une solution je suis preneur !
    Merci d'avance

  2. #2
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 301
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 301
    Points : 3 784
    Points
    3 784

    Par défaut

    Tu peux par exemple permuter les premier et dernier chiffres puis appliquer à nouveau l'algorithme sur le nombre composé des chiffres qui se trouvent entre les deux ; ainsi de suite jusqu'à ce que le nombre en entrée soit composé de moins de deux chiffres (au « centre »).

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 750
    Points : 3 757
    Points
    3 757

    Par défaut

    Bonjour,

    Tu peux aussi : Pour afficher un nombre dans l'ordre inverse :
    On commence par afficher la fin du nombre.
    Puis s'il reste quelque chose à afficher (condition facile à trouver) on affiche la suite (ce qui revient à appeler récursivement sur ce qui reste du nombre)

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Le problème est que je ne dois pas juste l'afficher, il doit se retrouver dans un autre entier.
    Intervertir les premier et derniers nombres pourrait etre une bonne idée, mais je ne vois pas comment je pourrais aller chercher ce premier chiffre, le nombre etant de longueur quelconque :/

  5. #5
    Membre éclairé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 348
    Points : 739
    Points
    739

    Par défaut

    Hello,

    Si tu as droit à tous les outils (pas comme dans certaines écoles), il y a une méthode très simple: tu fais un sprintf() du nombre dans une variable char[ ], tu inverses la variable char[ ], et tu récupères la solution par un atol() ( ou atoi() ). That's all, folk.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    En fait ce qui est frustrant c'est que j'ai changé d'ecole et je connaitrais plein de moyen de le faire :p
    Mais dans mon contexte, on a pratiquement que les outils de bases ( operations arithmetiques, modulo), le but étant de faire un algorithme très général et de le faire en une seule fonction
    Comme je n'utilise qu'une seule fonction qui prend en argument l'entier à inverser, le mettre dans un char[] me parait compliquer a cause de la recursivité ( ce qui reviendrait a chaque fois a le transformé en char[] )

    J'avais deja vu pas mal d'algorithme permettant de regler ce problème en n'utilisant que des addition multiplication, division et modulo mais de manière itérative. Théoriquement il devrait y avoir moyen de faire pareil de manière récursive mais apres plusieurs heures de reflexion je n'y parvient toujours pas :/ Mais merci quand meme

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    2 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 2 446
    Points : 5 567
    Points
    5 567

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <stdio.h>
    #include <stdlib.h>
     
     
    void reverse_integer01(int val, int* result, int* multiplier) {
        if (val > 9) {
            char digit = (val % 10);
     
            reverse_integer01((val / 10), result, multiplier);
            (*multiplier) *= 10;
     
            (*result) = ((digit * (*multiplier)) + (*result));
        } else {
            (*result)     = val;
            (*multiplier) = 1;
        }
    }
     
     
    void reverse_integer(int val, int* result) {
        if (result != NULL) {
            int multiplier;
     
            (*result) = 0;
     
            reverse_integer01(val, result, &multiplier);
        }
    }
     
     
    int main(int argc, char** argv)
    {
        int result;
     
        for(int val = 0; val < 1001; ++val) {
            reverse_integer(val, &result);
     
            printf("%d -> %d\n", val, result);
        }
     
        return 0;
    }

  8. #8
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 301
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 301
    Points : 3 784
    Points
    3 784

    Par défaut

    Tu ne peux effectivement pas faire l'économie de « compter les chiffres » ici. Soit via une boucle en amont, soit en ajoutant un élément de contexte à l'appel récursif comme l'a fait foetus, ou comme on le fait ci-après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned int rev_(unsigned int i, unsigned int r, unsigned int base) {
        if (i == 0)
            return r; // stop
        return rev_(i / base, r * base + i % base, base);
    }
     
    #define rev(i, base) rev_(i, 0, base)
    C'est un exemple de cas où l'algorithme récursif est moins élégant.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : janvier 2018
    Messages : 4
    Points : 2
    Points
    2

    Par défaut

    Oui je vois donc ici on serait effectivement obligé de passer par d'autres variable qu'on devra fournir en entrée
    C'est peut être un peu moins élégant pour l'appel de la fonction dans le main comme on doit lui fournir ses variables, mais dans ce cas la on pourrait tout simplement passer par une fonction intermediaire qui s'en chargerait :p
    Merci beaucoup de votre aide !

  10. #10
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 301
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 301
    Points : 3 784
    Points
    3 784

    Par défaut

    Oui dans mon exemple c'est le rôle de la macro, qu'on pourrait éventuellement remplacer par une fonction inline.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction de calcul de somme des chiffres d'un entier
    Par sam343 dans le forum Langage
    Réponses: 3
    Dernier message: 07/10/2009, 17h35
  2. Extraction des chiffres d'un entier
    Par adrian07 dans le forum Pascal
    Réponses: 5
    Dernier message: 21/04/2009, 17h22
  3. Réponses: 6
    Dernier message: 01/02/2009, 00h14
  4. [Tableaux] Aide pour inverser des chiffres
    Par Equinoxe5 dans le forum Fonctions
    Réponses: 5
    Dernier message: 30/01/2008, 23h32
  5. Permutations, maximum et minimum des chiffres d'un entier
    Par JetliMohamed dans le forum Pascal
    Réponses: 14
    Dernier message: 29/01/2008, 22h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo