IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Inversion des chiffres d'un entier


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    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
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    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
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 1 564
    Points : 7 640
    Points
    7 640
    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 : 26
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 622
    Points : 1 551
    Points
    1 551
    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.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    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 éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 628
    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 : 4 628
    Points : 10 553
    Points
    10 553
    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
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    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 : 26
    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
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Oui dans mon exemple c'est le rôle de la macro, qu'on pourrait éventuellement remplacer par une fonction inline.

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 0
    Points
    0
    Par défaut Solution à l'inversion des digits d'un entier
    Salut, je suis tombé sur le même genre d'exercice et en quelques boucle on peut tout a fait le faire.
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    /*==================[  RENVERSER ENTIER  ]====================*/
    /*
    	DESCRIPTION :		Renverse les digits d'uen entier donné
     
    	PARAMETRES :		Un entier quelconque
     
    	RETOURNE :		Un entier constitué des digits renversé.
     
    	SPÉCIFICATIONS :	Les valeurs négatives sont prises en cpmpte par
    				leurs valeurs absolues.
    */
    int reverse_digit(int n);
    /*====================================================================*/
     
     
    /*====================================================================*/
    /*
    	STRATÉGIE:	Cas particulier de 0 (11)
    			On commence par retirer les zero en derniere position (aa)
    			On compte le nombre de digit(bb)
    			On parcour les digits et on les agoute en puissance de 10(cc)
    */
    int reverse_digit(int n) {
     
    	int buffer = n;
    	int reverse = 0;
    	int compteur = 0;
    	int zero = 0;
     
    	//Selon specifications
    	n = abs(n);
     
    	//11
    	if (n == 0) { return 0; }
     
    	//aa
    	while (n % 10 == 0) { n /= 10; }
     
    	//bb
    	while (buffer != 0) {
    		++compteur;
    		buffer /= 10;
    	}
     
    	//cc
    	while (compteur != 0) {
    		--compteur;
    		reverse += (n % 10) * (int)pow(10, compteur);
    		n /= 10;
    	}
     
    	return reverse;
    }
    /*====================================================================*/

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 681
    Points : 30 969
    Points
    30 969
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par charlonien Voir le message
    et en quelques boucle on peut tout a fait le faire.
    Citation Envoyé par RobiwanKanab1s Voir le message
    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,
    Donc déjà d'une part il s'agit d'un exercice de manipulation de la récursivité et d'autre part il savait déjà le faire de façon itérative.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ 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 Langage
    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