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 :

Multiplication de tres grans nombres


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Multiplication de tres grans nombres
    bonjour a tous,
    voila je debute en c++ et je dois realiser une fonction qui fait le produit de 2 tres grand nombres en utilisant des string ,la fonction prend en paramtre 2 string et retourne 1 string a la fin qui est le resultat du produit .
    exple: string s1:40000000000000000000000000000000000000000000000000000000000 (plus encore comme c'est un ex je m'arrete la)
    string s2:50000000000000000000000000000000000000000000000000000000000000000
    string res=2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    j'ai fais un code qui prend 2 grands string qui les convertis en long double puis fait la multiplication mais le resultat m'est donner sous forme 1.37E+353 par exemple ,ce qui ne correspond pas a mes attentes si quelqu'un pouvais m'aider ,me donner des directives sur comment faut que je procede (vu que ma methode n'est pas bonne apprement) depuis l'entree de mes variable jusqu'au resultat afficher sous forme entiere et non en exposant .
    MERCI de votre comprehension
    nb:pardonner moi pour les accents j'ai un PC anglais.
    MON CODE:
    ===========================================================
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #include <iostream>
    #include <sstream>
    #include <string>
    #include <stdlib.h>
     
    using namespace std;
     
     
    string mult(string s1,string s2)
    {
    	istringstream istr(s1);
    	istringstream iss(s2);
     
    	long double i,j,nb1,nb2;
    	long double res;
    	if((istr >> i) and (iss>> j))
    	{
    		cout<<"entier 1 entree:"<<i<<endl;
    		cout<<"entier 2 entree:"<<j<<endl;
    		nb1=i;
    		nb2=j;
    		res=i*j;
     
     
    	}
    	else cout<<"erreur"<<endl;
     
    	cout<<"nb1:"<<nb1<<endl;
    	cout<<"nb2:"<<nb2<<endl;
     
     
    	ostringstream oss;
    	if(oss<<res)
    	string s= oss.str();
    	cout<<"Resultat:"<<s<<endl;
    	return s;
    }
     
    /*
    string mult(string s1,string s2)
    {
    	int mul,i,j;
    	string res;
     
      for (i=0; i<s1.size();i--)
        {
          for (j=0; j<s2.size();j--)
            {
              mul = (s1[i] - '0') * (s2[j] - '0');
              res[i + j] += ((res[i + j + 1] + mul - '0') / 10);
              res[i + j + 1] = ((res[i + j + 1] + mul - '0') % 10) + '0';
            }
        }
     cout<<"resultat:"<<res<<endl;
     
    }
    */
     
     
     
     
    int main ()
    {
     
     	string s1, s2;
     
     	cout << "Tapez une chaine 1 : "; cin >> s1;
    	/*convert(s1);*/
     
     
    	cout << "Tapez une chaine 2: "; cin >> s2;
    	/*convert(s2);*/
    	mult(s1,s2);
     
    	return 0;
     
    }

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Ce n'est pas très difficile, il suffit de dire à std::cout dans quel format tu veux le nombre.

    Exemple:

    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
    #include <iostream>
    #include <string>
    #include <sstream>
     
    int main()
    {
      std::string myString = "2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
      long double monNombre = 0;
      std::istringstream istr(myString);
      if(istr >> monNombre)
      {
        std::cout << std::fixed << monNombre << std::endl;
      }
     
      return 0;
    }
    Tu noteras qu'on observe une perte de précision puisque ce qui est affiché n'est pas la chaîne de départ ce qui est normal. A noter tout de même : on n'a pas le même résultat avec Visual Studio et avec GCC. Plein d'autres manipulations sur le format d'affichage sont possibles.
    Find me on github

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoe,

    Je pense que tu fais fausse route, et qu'on te demande en fait d'écrire une fonction faisant le calcul exact de la multiplication demandée.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par droggo Voir le message
    Hoe,

    Je pense que tu fais fausse route, et qu'on te demande en fait d'écrire une fonction faisant le calcul exact de la multiplication demandée.
    C'est bien possible, as-tu besoin d'aide sur cette partie ? Je n'avais vu que le souci d'affichage.
    Find me on github

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    C'est bien possible, as-tu besoin d'aide sur cette partie ? Je n'avais vu que le souci d'affichage.
    merci a toi jblecanard pour ces reponses donnees aussi vite mais comme la dit droggo ta pas bien compris ce que je voulais au depart .
    oui j'ai besoin d'aide sur cette partie(pour le calcul exacte des ces 2 grands nombres)

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Y a une infinité d'algo pour ca ( avec infini = 5 dans ce cas):

    http://en.wikipedia.org/wiki/Integer...r_large_inputs

    Sauf si tu as des nombres a plusieurs kilochiffres, Karatsuba est suffisant (http://en.wikipedia.org/wiki/Karatsuba_algorithm) sinon l'algo FFT bat tout le reste asymptotiquement.

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kai,
    Citation Envoyé par Joel F Voir le message
    Y a une infinité d'algo pour ca ( avec infini = 5 dans ce cas):

    http://en.wikipedia.org/wiki/Integer...r_large_inputs

    Sauf si tu as des nombres a plusieurs kilochiffres, Karatsuba est suffisant (http://en.wikipedia.org/wiki/Karatsuba_algorithm) sinon l'algo FFT bat tout le reste asymptotiquement.
    À partir du moment où on lui demande de travailler avec des chaînes de caractères, c'est qu'on attend une implémentation "naïve", et qu'il n'est pas nécessaire d'aller chercher des algorithmes spéciaux.
    Si les cons volaient, il ferait nuit à midi.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour.

    Je te conseille fortement l'usage d'une librairie spécialisée dans les calculs sur grands nombres:
    http://gmplib.org/manual/
    Celle ci marche très bien et est simple d'usage.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Je te conseille fortement l'usage d'une librairie spécialisée dans les calculs sur grands nombres:
    http://gmplib.org/manual/
    Celle ci marche très bien et est simple d'usage.
    Réponse :
    À partir du moment où on lui demande de travailler avec des chaînes de caractères, c'est qu'on attend une implémentation "naïve"
    A priori, c'est un exercice, donc pas besoin de lui proposer des choses déjà faites ou trop complexe. L'idée à mon avis : ressortir les cours de l'école primaire et utiliser la méthode apprise à l'époque.

Discussions similaires

  1. Tester si une chaîne peut être un nombre d'un type particulier
    Par rambc dans le forum Général Python
    Réponses: 11
    Dernier message: 27/10/2009, 16h33
  2. Produit de TRES grand nombre
    Par EricStib dans le forum Général Python
    Réponses: 4
    Dernier message: 03/01/2009, 18h38
  3. Gestion de TRES gros nombres
    Par Clorish dans le forum Général Java
    Réponses: 6
    Dernier message: 27/03/2008, 17h34
  4. html:select multiple et limitation du nombre de choix
    Par badoress dans le forum Struts 1
    Réponses: 5
    Dernier message: 26/03/2008, 15h20
  5. gerer des tres grand nombres
    Par Lorenzo77 dans le forum Delphi
    Réponses: 3
    Dernier message: 10/06/2006, 20h19

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