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 :

fonction qui inverse un nombre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut fonction qui inverse un nombre
    Bonjour,

    je dois ecrire une fonction qui inverse un nombre par exemple 12345 doit devenir 54321

    j'ai fais un code mais là, je bloque. Le soucis se trouve avec le j, il devrait representer le plus grand i mais là, ... je sais pas
    ca marche pour un nombre de 3 mais pas plus

    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
    55
    #include <iostream>
    using namespace std;
    #include <stdlib.h>
    #include <math.h>
    int f(int a);
    int s,y, a,j, i,n ;
    int   x;
     
    int f(int a)
     
    {cin>>a;s=0;
    while(a>=10){
     
     x= a/10;
     i=1;
    while (x >=10)
     
    {
     x=x/10;
     i++;
     j=i;
     } 
      cout<<"i ="<<i<<endl;
     
      cout<<"j ="<<j<<endl;
     
    y= x*int(pow(10,j-i));
    a= (a- double (x* pow(10,i)));  
    cout<<"nouveau a "<<a<<endl;
     cout<<"x "<<x<<endl;
    cout<<"y ="<<y<<endl;
     s=s+y ;
     cout<<"s "<<s<<endl;
    }x=a;
     
     cout<<"a"<<a<<endl;
    cout<<"x "<<x<<endl;
    cout<<"j ="<<j<<endl;
    double p=double (pow(10,j)); cout<<"p"<<p<<endl;
    double e=( x*p);cout<<"e"<<e<<endl;
    s=s+e;
     
    return s;
    }  
     
     
     
    int main (void)
    {
     
    cout<<"sol  =   "<<f(a)<<endl;
     
    system("pause");
    return 0;
    }

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 4
    Par défaut
    bonjour,

    un algorithme qui fonctionnerait serait de passer par une chaine de caractères:
    - nombre1, nombre2 des entiers
    - chaine1, chaine2 des chaines de caractères de meme longueur
    - convertir(nombre1, chaine1)
    - pour i de 0 à longueur(chaine1)
    chaine2(i) = chaine1(longueur(chaine1)-i)
    fin pour
    - convertir(chaine2, nombre2)

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le fait est qu'il faut créer un algorithme cohérent, car il n'existe - à ma connaissance - rien de pareil.

    Ce que je te conseillerais, c'est de te baser sur trois propriétés propriétés intéressantes en ce qui concerne les entiers:
    1. Il est possible de récupérer le reste d'une division entre deux entiers en utilisant %
    2. Si le résultat de la division entre deux entiers est inférieur à 1, on obtient 0.
    3. si tu prend le reste de la division par 10 d'un entier, tu obtiens... les unités

    L'idée devient alors relativement simple:
    • tu déclare une variable de retour, de type entier, que tu initialise à 0
    • Tant que la valeur d'origine est plus grande que zéro, il va falloir "mouiller la chemise"
    • tu additionne le reste de la division de la valeur d'origine par 10 à la variable de retour
    • Comme il faut tout décaler "d'un cran vers la gauche" si la valeur d'origine est supérieure à dix, tu multiplie la valeur de retour par dix si c'est le cas
    • tu n'a plus qu'à diviser la valeur d'origine par dix pour recommencer le travail.
    • Une fois que la valeur d'origine vaut 0, tu peux renvoyer la valeur de retour

    Cela pourrait se traduire par un code proche de ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int inverse(int origine)
    {
        int result = 0;
        while(origine>0)
        {
            result+=(origine%10);
            if(origine>10)
                result*=10;
            origine/=10;
        }
        return result;
    }
    qui pourrait très bien être utilisé dans un cadre proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        int orig;
        int result;
        cin >>orig;
        result=inverse(orig);
        cout<<result<<endl;
        return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par francois987 Voir le message
    bonjour,

    un algorithme qui fonctionnerait serait de passer par une chaine de caractères:
    - nombre1, nombre2 des entiers
    - chaine1, chaine2 des chaines de caractères de meme longueur
    - convertir(nombre1, chaine1)
    - pour i de 0 à longueur(chaine1)
    chaine2(i) = chaine1(longueur(chaine1)-i)
    fin pour
    - convertir(chaine2, nombre2)
    Oui le plus élégant est de passer par une chaîne de caractère (ou un vecteur de chiffres).
    L'idée est là mais ça marche pas.
    Il suffit d'échanger les caractères 2 à 2 par rapport à "l'axe de symétrie" de la chaîne de caractères.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Le plus élégant serait sûrement de faire un itérateur qui soit capable d'extraire les digits un à un, d'inverser la séquence avec un autre d'adapteur, puis de regénérer l'entier à partir de cette séquence.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Oui le plus élégant est de passer par une chaîne de caractère (ou un vecteur de chiffres).
    L'idée est là mais ça marche pas.
    Il suffit d'échanger les caractères 2 à 2 par rapport à "l'axe de symétrie" de la chaîne de caractères.
    A vrai dire, il faut voir quel est l'usage de cette valeur inversée...

    Mais j'ai du mal à comprendre "pourquoi ce serait plus élégant" de passer par une chaine de caractères

    Quand on y pense, le fait de convertir un entier ne chaine de caractère ne demandera pas beaucoup moins de travail (du point de vue du processeur) que la petite fonction que j'ai présentée...

    De plus, sur les (très) gros nombres, tu te trouvera face à l'utilisation de N caractères là où... un int aurait très bien pu suffire...

    Cela n'a peut être l'air de rien, mais, ce qui est pris n'est plus à prendre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par koala01 Voir le message
    A vrai dire, il faut voir quel est l'usage de cette valeur inversée...

    Mais j'ai du mal à comprendre "pourquoi ce serait plus élégant" de passer par une chaine de caractères

    Quand on y pense, le fait de convertir un entier ne chaine de caractère ne demandera pas beaucoup moins de travail (du point de vue du processeur) que la petite fonction que j'ai présentée...

    De plus, sur les (très) gros nombres, tu te trouvera face à l'utilisation de N caractères là où... un int aurait très bien pu suffire...

    Cela n'a peut être l'air de rien, mais, ce qui est pris n'est plus à prendre
    Elégant = simple, concis et évident, ce qui n'implique pas qu'il soit efficace.

    Chaîne de caractère, c'est une façon de parler, dans le sens où l'algorithme est essentiellement un traitement sur la représentation d'un nombre dans une base donnée, et non pas sa valeur!

    C'est un traitement purement visuel (palindrome, tout ça).
    Ce que loufoque propose est une autre implémentation.

    ----

    Pour des int, ta solution est probablement la plus efficace ceci-dit, mais pour un très grand nombre style BigInt, je ne vois pas pourquoi tu dis que ta solution ne demanderait qu'un int ?

    OK, en terme de complexité mémoire, ma solution naïve demanderait une occupation en O(log(N)/log(base)) caractères.

    Mais toi, il faudra faire le modulo, la multiplication, l'addition, ce qui est potentiellement lourd aussi!

  8. #8
    Membre habitué
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    je vous remercie par vos reponses ,je n ai pu utiliser les chaine de caracteres car je ne suis pas sensée trvailler avec les vecteurs, (consignes du prof)
    Merci koala pour ta reponse ,elle m'a ete d une grande aide

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Mais toi, il faudra faire le modulo, la multiplication, l'addition, ce qui est potentiellement lourd aussi!
    L'addition et la multiplication sont des opérations de base, qui ne demande finalement que très peu de temps d'exécution et de resources...

    Il n'est pas impossible que le modulo prenne effectivement un peu plus de temps, mais, à mon sens, tout cela prend de toutes manière beaucoup moins de temps et de ressources que de passer par une conversion vers les caractères correspondant à chaque type... (même si la conversion naïve en caractères représentant le nombre se baserait aussi sur ces opérations mathématiques, une fois la conversion effectuée, tu dois encore... inverser le tout )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. fonction qui compare 3 nombres
    Par Maxence45 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 17/11/2007, 19h42
  2. fonction qui calcule le nombre de checkbox cochés
    Par namstou3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2007, 13h55
  3. fonction qui renvoie le nombre de possibilité
    Par psyko72 dans le forum Mathématiques
    Réponses: 8
    Dernier message: 21/04/2007, 21h59
  4. Fonction qui totalise des nombres mais met 1 au lieu de 1.5
    Par beegees dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/09/2006, 16h05
  5. Fonction qui compte le nombre de jours ouvrés par mois
    Par griese dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/07/2006, 15h32

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