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 :

Calcul de grands nombres


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Marennes
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Marennes

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Calcul de grands nombres
    bonjours à tous.

    excusez moi je commence en programmation c++ j'ai fait une petite calculatrice pour démarer, mais quand je veux multiplier un nombre a 7chiffres par un autre aussi à 7 chiffres, sa m'indique un résultat faux. pourquoi? je ne trouve pas mon erreur.
    je vous transmet mon programme, pour vous donner une idée.
    Ah pardon, si ce n'est pas ici qui fallait poster mon message.

    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
    56
    57
    58
    59
    60
    61
    62
    #include <iostream>
    #include <cstdlib>
     
     
    using namespace std;
     
    int main()
    {
        char mon_choix('a');
        int nombre_1(9);
        int nombre_2(9);
        int resultat(9);
        cout<< "\n\nprogramme de calculette!\n";
        cout<<"\ntapez 'a' pour addition ou 'm' pour multiplier ou 'd' pour division ou 's' pour sous-traction ou 'Q' pour quitter\n";
        cin >> mon_choix;
        if (mon_choix=='a'){
            cout<<"\nvous avez choisi l'Addition\n";
            cout<<"\nchoisissez vos deux nombre\n";
            cin>>nombre_1;
            cin>>nombre_2;
            cout<<"\n"<<nombre_1<<"+"<<nombre_2;
            resultat=nombre_1+nombre_2  ;
            cout<<  "  votre resultat est: ";
            cout<<resultat;
            cout << " - Termine\n";
            main();
        }
        if (mon_choix=='m'){
            cout<<"\nvous avez choisi la Multiplication\n";
            cout<<"\nchoisissez vos deux nombre\n";
            cin>>nombre_1;
            cin>>nombre_2;
            cout<<"\n"<<nombre_1<<"*"<<nombre_2;
            resultat=nombre_1*nombre_2  ;
            cout<<  "  votre resultat est: ";
            cout<<resultat;
            main();
         }
         if (mon_choix=='d'){
            cout<<"\nvous avez choisi la Division\n";
            cout<<"\nchoisissez vos deux nombre\n";
            cin>>nombre_1;
            cin>>nombre_2;
            cout<<"\n"<<nombre_1<<"/"<<nombre_2;
            resultat=nombre_1/nombre_2  ;
            cout<<  "  votre resultat est: ";
            cout<<resultat;
            main();
        }
        if (mon_choix=='s'){
            cout<<"\nvous avez choisi l'Sous traction\n";
            cout<<"\nchoisissez vos deux nombre\n";
            cin>>nombre_1;
            cin>>nombre_2;
            cout<<"\n"<<nombre_1<<"-"<<nombre_2;
            resultat=nombre_1-nombre_2  ;
            cout<<  "  votre resultat est: ";
            cout<<resultat;
            main();
        }
        return 0;
    }
    merci a vous de m'aider

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Alerte: Eric17m appelle la fonction main (sans paramètres d'autant plus) à la main




    Mets en place une boucle while, tant que mon_choix différent de 'q' (<- pour quitter)


    Citation Envoyé par Eric17m Voir le message
    je veux multiplier un nombre a 7chiffres par un autre aussi à 7 chiffres, sa m'indique un résultat faux. pourquoi? je ne trouve pas mon erreur
    C'est normal

    Tu travailles avec un compilateur 32 bits et une variable int est codée soit sur 16 bits (max 65536) soit sur 32 bits (max 4294967296).
    Essaye de passer par un long int.

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Les type de base utilise un représentation mémoire à octet fixe, et par conséquent une limite min et max: http://en.cppreference.com/w/cpp/lan...ange_of_values

    Il faut soit passer par des types plus grands (long long) soit utiliser des bibliothèques pour utiliser des nombres "sans limite" (hors mi la mémoire) comme boost::cppint.

    Par contre, ne jamais rappeler la fonction main. Il me semble que sur certain compilateur cela fou la grouille. Utilise une boucle à la place.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    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 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    soit utiliser des bibliothèques pour utiliser des nombres "sans limite" (hors mi la mémoire) comme boost::cppint.
    List of arbitrary-precision arithmetic software

    et C++ Big Integer Library, mais plus maintenue

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    main() ne doit pas être appelé par le programme. C'est dit explicitement dans la norme.

    Il faut faire une fonction dédiée.

    à ce sujet, regarder les spécificités de main()
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Sinon, en dehors de boost qui est assez lourd, il y a la NTL, une librairie dédiée au calcul de grands nombres, et que j'ai trouvé pas mal du tout.
    Nullius in verba

  7. #7
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Bonjour,

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        int nombre_1(9);
        int nombre_2(9);
        int resultat(9);
    Ne crée pas des entiers de 9 chiffres comme tu sembles le croire, mais initialise les variables avec la valeur 9.

  8. #8
    Membre actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Points : 259
    Points
    259
    Par défaut
    on peut également utiliser des strings pour des nombres de taille arbitraire (ici l'exemple de la multiplication d'un entier de taille arbitraire converti en string par entier de 1 digit converti en char) :
    (nb: je suis débutant donc le code est peut-être tout pourri mais en tout cas ça fonctionne).

    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
    string multiplication(const string & str1, const char & str2)
            {
                unsigned len = str1.size();
                unsigned r = 0;
                string res(len + 1, 48);
                for (int i = len; i != 0; i--)
                {
                    int inter = r;
                    inter += ((int)str1[i-1]-48)*((int)str2 - 48);
                    if (inter == 0)
                    {
                        r = 0;
                    }
                    else
                    {
                        r = inter/10;
                    }
                    res[i] = inter%10 + 48;
                }
                if (r != 0)
                {
                    res[0] += r;
                }
                else
                {
                    while (res[0] == '0' && res.size() != 1)
                    {
                        res.erase(res.begin());
                    }
                }
                return res;
            }

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Les strings, c'est précisément l'approche des Big Integers.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. calcul "grand" nombre fiable en c++?
    Par -Gesicht- dans le forum C++
    Réponses: 2
    Dernier message: 21/05/2013, 14h49
  2. calcul du plus grand nombre
    Par bernards111 dans le forum Général Python
    Réponses: 23
    Dernier message: 13/05/2011, 13h53
  3. Réponses: 14
    Dernier message: 05/10/2010, 15h26
  4. Calcul Grand nombre
    Par Thesum4113 dans le forum C#
    Réponses: 3
    Dernier message: 08/01/2008, 17h14
  5. Réponses: 14
    Dernier message: 18/11/2005, 14h06

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