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 :

Addition sur des entiers longs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut Addition sur des entiers longs
    Bonjour,
    Je dois faire plusieurs opérations sur des entiers longs. Mais je bloque déjà à l'opération.
    J'ai crée un type Entier_long qui contient un signe, une taille, et un tableau dans lequel est stocké chaque chiffre de mon entier long.

    Je n'arrive pas trop m'en sortir, car il faut gérer plusieurs points :
    -la taille des 2 entiers à comparer
    -leur signe respectif
    -le cas d'une retenue en plein milieu du nombre, mais aussi dans le cas où la retenue fait "grandir" la taille du nombre de +1.
    -J'en oublie peut-être...

    J'ai fait une multitude de tests, mais aucun n'était bon.
    Je laisse une esquisse du dernier que j'ai testé, ça se trouve je suis sur la bonne voie...

    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
     
    void Addition (Entier_long a, Entier_long b)
    {
        int taille_1=0, taille_2=0;
        int reste=0, i=0, s;
        int Max=0, Min=0;
        taille_1=a.taille;
        taille_2=b.taille;
        Entier_long NbGrand, NbPetit;
        int somme[Max+2];
     
        if(taille_1>=taille_2) 
        {
            Max=taille_1;
            Min=taille_2;
            NbGrand=a;
            NbPetit=b;
     
        }
        else
        {
            Max=taille_2;
            Min=taille_1;
            NbGrand=b;
            NbPetit=a;
        }
     
        for(i=0;i<Min;i++)
        {
            s=NbGrand.Chiffres_sign[i]+NbPetit.Chiffres_sign[i]+reste;
            reste=s/10;
            s=s%10;
            somme[i]=s;
        }
        for(i=Min;i<Max;i++)
        {
            s=NbGrand.Chiffres_sign[Max]+reste;
            reste=s/10;
            s=s%10;
            somme[i]=s;
        }
     
        /* Affichage de l'addition */
        for(i=1;i<Max+1;i++)
        {
            printf("%d", somme[i]);
        }
    }
    J'ai tourné le problème dans divers sens, donc la méthode que je propose n'est peut-être pas la bonne, c'est la dernière que j'ai testé.( dans ce code je ne m'occupe pas encore des signes, si j'arrive déjà à additionner 2 nombres positifs ce sera un bon début)
    Est-ce que quelqu'un pourrait m'aider ou me guider ?
    Je peux afficher d'autres parties de mon code si besoin.

    Merci d'avance !

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Hello,

    Il manque une info importante: le détail de ta structure "Entier_long" et surtout comment tu renseignes tous les champs.

    Le point sensible de ton code c'est: comment sont rangés les chiffres ? D'après ce que tu as déjà codé, il est impératif que le chiffre des unités soit dans Chiffres_sign[0], le chiffre des dizaines dans Chiffres_sign[1], etc ... C'est-à-dire dans l'ordre inverse de celui dans lequel on écrit les nombres.

    Par ailleurs, ta boucle d'affichage a un offset de 1 case, je n'ai pas compris pourquoi!

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Pour rebondir sur les conseils de nnovic, es-tu assuré du bon fonctionnement du reste du programme que nous n'avons pas ici ? Je veux dire, la toute première version validée (les « fondations ») devrait ressembler à quelque chose de ce genre :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
        // ...
    } longint;
     
    int longint_create(longint *i) {
        // ...
    }
     
    void longint_destroy(longint *i) {
        // ...
    }
     
    void longint_set(longint *dst, long value) {
        // ...
    }
     
    void longint_print(FILE *stream, const longint *i) {
        // ...
    }
     
    int main(int argc, char *argv[]) {
        longint i;
        if (longint_create(&i) != 0)
            return 1;
     
        longint_print(stdout, &i);
     
        longint_set(&i, 16549823l);
        longint_print(stdout, &i);
     
        longint_destroy(&i);
        return 0;
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Bonjour,

    Tout d'abord merci pour vos 2 réponses.

    Concernant la déclaration de la structure, voici son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct
    {
        char signe;
        int taille;
        int	Chiffres_sign[Dim]; /* Dim vaut 400, il y a un define Dim 400 en haut du programme */ 
    }Entier_long;
    Ensuite, pour remplir mon Chiffre_sign[], je fais une boucle de 0 à x.taille (x.taille exclut) donc si mon nombre est 123, je rentre le 1, puis le 2, puis le 3. Du coup en faisant comme ça, mon chiffre des unités se trouve dans la dernière case, ça parait plus logique de faire comme ceci, que de rentrer un nombre à l'envers ?
    Durant mes divers essais, j'avais également fait des essais avec des boucles partant de la fin jusqu'au début du nombre, mais ce n'était pas concluant. Dans mon cas, c'était cette méthode à adopter ?
    Concernant le "Max+1", c'était un peu expérimental, mais c'était fait pour le cas où le résultat est plus long (en taille) que mes 2 nombres à additionner.

    Le reste du programme fonctionne oui, enfin il fait ce que je souhaite (c'est-à-dire comparer mes 2 nombres, afficher l'opération souhaitée, ...) . Mais ce n'est cependant pas exactement comme le tien, Matt_Houston.

  5. #5
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Citation Envoyé par Stéphanois57 Voir le message
    Ensuite, pour remplir mon Chiffre_sign[], je fais une boucle de 0 à x.taille (x.taille exclut) donc si mon nombre est 123, je rentre le 1, puis le 2, puis le 3. Du coup en faisant comme ça, mon chiffre des unités se trouve dans la dernière case, ça parait plus logique de faire comme ceci, que de rentrer un nombre à l'envers ?
    Fais une addition avec un papier et un stylo, tu verras que tu commences bien par additionner les chiffres par la fin. D'abord les unités, ensuite les dizaines, puis les centaines... Concentre-toi sur ça pour commencer.

  6. #6
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Par défaut
    Oui oui ça je sais, j'avais déjà fait, mais je ne parvenais pas à ce que je voulais.
    Je crois que j'avais écris quelque chose comme ça :
    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
     
    void Addition (Entier_long a, Entier_long b)
    {
        int taille_1=0, taille_2=0;
        int reste=0, i=0, s;
        int Max=0, Min=0;
        taille_1=a.taille;
        taille_2=b.taille;
        int Somme[Max+2];
     
        if(taille_1>=taille_2)
        {
            Max=taille_1;
            Min=taille_2;
     
        }
        else
        {
            Max=taille_2;
            Min=taille_1;
        }
     
        for (i=Max ; i>0 ; i--)
        {
            s=a.Chiffres_sign[i]+b.Chiffres_sign[i]+reste;
            if (s>9)
            {
                Somme[i]=s%10;
                reste=1;
            }
            else
            {
                Somme[i]=s;
                reste=0;
            }
        }
        /* Affichage de l'addition */
        for(i=0;i<Max+2;i++)
        {
            printf("%d", Somme[i]);
        }
    }
    Le principe est bien comme ça ?

    Le problème en faisant ça, c'est que si les 2 nombres n'ont pas la même taille il y un a.Chiffres_sign[i] ou b.Chiffres_sign[i] qui n'existe pas.

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

Discussions similaires

  1. [TPW] Calculatrice effectuant des opérations sur les entiers longs
    Par forum dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 04/12/2011, 11h36
  2. Réponses: 0
    Dernier message: 04/12/2011, 11h29
  3. opération "et" de boole sur des entiers
    Par Crapuleux_Crapaud dans le forum Général Python
    Réponses: 2
    Dernier message: 17/06/2010, 23h06
  4. Addition sur des floats
    Par Invité dans le forum C
    Réponses: 9
    Dernier message: 26/02/2010, 06h55
  5. [DB2] LIKE sur des entiers
    Par heloise dans le forum DB2
    Réponses: 1
    Dernier message: 07/10/2004, 23h30

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