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 :

Entiers inhabituels (long)


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut Entiers inhabituels (long)
    bonjour a vous tous et toutes ,

    je vous ai apporter qlq chose de nouveau et je pense que c'est un peu difficile (pour moi lol) ,, je veux realiser (en c++) une class Xint pour gerer des entiers de longue taille qui sera derivée d'une autre class Array qui gere des vecteurs de chaine de charactaire je propose (shé pas si des entiers va marché) .

    - La base que j'utiliserai est 10000 (par 4 case) .

    - un operateur * pour multiplication de deux Xint .

    - l'appel au constructeur sera de la maniere suivante Xint X('1254875124596584254254')

    Veulliez-m'aidez mes cheres amis et amies et --_-- Merciii --_--

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Salut,

    Je ne vois pas trop la question dans ton texte, mais si ton but est de savoir comment bien faire une classe en C++, je ne peux que te renvoyer vers les cours de la section C++.
    N'hésite pas à les consulter, ils sont tous assez complets et tu y trouveras certainement beaucoup de réponses.
    Il y a également la FAQ C++ qui peut t'aider.

    Toutefois j'ai tout de même une remarque: fais une recherche sur le forum, j'ai déjà vu passer des sujets sur des classes de grands nombres comme le tienne.

    Bon courage

  3. #3
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    mon prob c'est pas de realiser une class , de faire une classe Xint qui va heriter de la class Array(vecteur) pour manipuler des enties de grands nombre.

    A propos j'ai beau chercher sur le forum mais en vain ,, si tu l'a trouve par hasard stppppp n'hesite pas de me contacter le lien dont je seré bien bien reconnaissant et Merci --_--

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Cherché quoi?

    Bon sinon la solution là c'est pas d'hérité... une simple composition (me souvient jamais si c'est le bon terme) suffit. A savoir que t'a classe Xint doit comporter un membre vector. (les array ça existe pas dans la bibliothèque standard.)

  5. #5
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    oui exactement la class Array c'est à moi de la faire elle sera comme class de base et celle de Xint sera la class derivée de Array de propose une class Array comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Array
    {    
          protected:
                unsigned taille;
                char  *T ;  
          public:
               Array();// Constructeur par défaut (crée une chaîne vide "")
               Array(char *);// Constructeur surchargé (crée la chaîne envoyée)
               Array(const Array &);// Constructeur de copie
               ~Array();      
     
     
          };
    je propose comme class derivée Xint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Xint : public Array{
     
    public :
     
     
        // ici shui bloqué je ne sais pas quoi mettre !!!
    };
    Lors de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main(){
     
    Xint x,y,z = 145125122;
    Xint w("12154252321458754859");
     
    y=x+w;
    z=w*x;
    cout<<z;
     
    }

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Est ce pour un exercice? Parce que sinon autant utilisé la class vector de la STL.

  7. #7
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    Oui c'est pour un exercice donné .

  8. #8
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Oki. Bon alors comme je te l'ai dit il ne faut pas hérité de array. L'héritage public est une relation forte et ici il n'y en a pas besoin. T'a classe Xint à juste besoin d'avoir comme données membres un Array qui contiendra des int n tel que :

    0<=n<10

    Ainsi chaque case de ton tableau représenterai un chiffre de ton Xint.

  9. #9
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Voilà une solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Array
    {    
          protected:
                unsigned taille;
                char  *T ;  
          public:
               Array();// Constructeur par défaut (crée une chaîne vide "")
               Array(char *);// Constructeur surchargé (crée la chaîne envoyée)
               Array(const Array &);// Constructeur de copie
               ~Array();
     
               void resize(size_t );
               void assign(char *);      
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Xint : public Array{
     
    public :
        Xint(char *str);
        Xint(long long);
        Xint(const Xint&);
     
        Xint operator * (const Xint&) const;
        Xint operator + (const Xint&) const;
        Xint operator - (const Xint&) const;
        bool operator == (const Xint&) const;
     
        const char *get_chaine() const; //pour pouvoir afficher
    };

    Après, si tu as des problèmes sur le code d'une fonction, tu peux toujours demander de l'aide, mais réfléchis déjà à la manière dont tu va convertir un entier en chaîne de caractère (pour le constructeur de Xint qui prend un entier en paramètre).

  10. #10
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    bonjour je repropose une autre class :
    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
    class Array {
     
    protected :
                 char * machaine;
    public :
     
    Array(){ machaine = 0;}
    Array(char * unechaine){ 
     
             machaine = new char[strlen(unechaine)+1];
             strcpy(machaine,unechaine); } 
     
    };
     
    class Mint : public Array {
     
    public:
     
    Mint():Array( ){ };
    Mint(char * unechaine):Array(machaine){ };
    } ;
    Mais le probleme pour moi c'est comment manipuler le grand nombre , dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mint(char * unechaine):Array(machaine){  // je ne sais pas koi faire ici !!}
    voila ce que j'ai copié du tableau mais je l'ai pas bien compris c'est un peu le principe

    on va par exemple reserver un tableau de 18 case :


    18 / 4 = 5

    ---> ca c'est le tableau :
    ---> la base c'est 9999 donc " 10000 comme facteur " .
    ---> la manipulation se fait par 4 case.
    ----------------------------------------
    | |9|0|0|1|5|7|8|9|4|6|7|9|4|2|0|2|2|7
    ----------------------------------------


    Array A ;

    A[4]*[10000^4]+A[3]*[10000^3]+A[2]*[10000^2]

    + A[1]*[10000] + A[0]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i=0;i</*(je pense <4)*/ ;i+=4)
    for(j=i;j<i+4;j++)
    J'aimerais trééééééééééés bien que kelkin le comprenne et me l'explique un peu et si vous avez des propositions (simmmple ) n'hesitez pas --_--

  11. #11
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Il faut définir l'operator[] pour ton array...

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 17
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Tu peux transformer un chiffre en char*:

    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
     #include <iostream>
    using namespace std;
     
    char a [11];
    int b[] = {1,2,3,4,9,0,1,2,2,0};
     
    int main () {
        for (int i = 0; i < 10; i++)
        {
           a[i] = '0' + b[i];
        }
     
        a[10] = 0;
     
        cout << a << endl;
     
        return 0;
    }

  13. #13
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    Merci pour vous mais moi je cherche le contraire je cherche à transformer une chaine en un entier qui est long , puisqu 'il n'existe pas un type d'entier tres long exemple 1245874547458474 j'ai voulu definir cette class que je nomme Mint "multiple precision integer " le constructeur va recevoir le grand nombre sous forme d'une chaine de char....

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Par défaut
    Pas clair tout ça...

    A quoi sert la classe Array ? Tu dis qu'elle gere un *vecteur* de chaine de caractère. Mais alors pourquoi elle ne contient qu'un pointeur ?

    Et tant bien même que Array contiennent un vecteur de chaines de caractère, il parait plus sens de contenir un vecteur d'entier : les éléments représenteraient la décomposition du grand entier dans la base considérée (10 000 dans notre cas). Bien sur, tu ne pourras généralement pas faire ce calcul la, puisque ton entier est trop grand :
    A[4]*[10000^4]+A[3]*[10000^3]+A[2]*[10000^2]+ A[1]*[10000] + A[0].

    Par contre, tu pourras faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_string(A[2]) + to_string(A[1]) + to_string(A[0])
    pour représenter ton grand entier.

    Pour transformer des chaines de caractère en entier, tu peux utiliser les std::istringstream. Bien sur, tu aura découper au préalable ta longue chaine en plusieurs chaines plus petites.

    Avec ca, tu n'as toujours pas gagner mais tu peux deja avancer...

  15. #15
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Non mais ... c'est bien ce que je disais. Bon je vais montré la théorie t'adapteras à ton code... :

    Pour décomposer en venant d'une chaine de caractéres vers un int la méthode est direct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(unsigned int i = 0; i < laChaineAdecouper.size(); ++i)
           tonMint[i] = laChaineAdecouper[i];
    Bien sur ça implique que la classe chaine utilisé surcharge l'opérateur [].

    Pour décomposer en venant d'un entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int i = 0;
     
    while(tonEntierAdecouper >= 0)
    { 
            tonMint[i] = tonEntierAdecouper%10;
            tonEntierAdecouper /= 10;
            ++i
    }

    Bon avec ça le nombre est stocké à l'envers dans le tableau, mais c'est pas bien grave...

  16. #16
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    donc comment je peux faire (le code ) pour faire la multiplication de deux Xint (les deux grand nombre)

    Ex :

    Xint a("142514785498754475");
    Xint b("14514787");

    Xint c = a*b; ?????????????

  17. #17
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par devaben Voir le message
    donc comment je peux faire (le code ) pour faire la multiplication de deux Xint (les deux grand nombre)

    Ex :

    Xint a("142514785498754475");
    Xint b("14514787");

    Xint c = a*b; ?????????????
    En définissant les opérateurs '*' et '=' pour la classe Xint

  18. #18
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    Oui exactement mais je suis bloqué sur ca la definition comment va etre ??

  19. #19
    Membre actif
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Par défaut
    je vous propose ce code svppp veuillez me le corriger et Merci a vousssss


    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
    class Array {
     
    protected :
                 unsigned  int  * le_nombre;
                 int taille;
    public :
     
    Array(){ le_nombre = 0;}
    Array(char * unechaine){ 
     
                    // je ne sais pas quoi mettre ici :$
              } 
    void inserer(int nombre);  // je pense la mettre virtual !
    int & operator[](int indice){ return le_nombre[i]; }
    };
     
    class Mint : public Array {
     
    public:
     
    Mint():Array( ){ };
    Mint(char * la_chaine):Array(strlen(la_chaine)){ 
     
    int position=0;
     
    	for(int i=0;i<strlen(la_chaine);i++)
    	{
    		inserer(la_chaine[i]-'0',position);
    		position++;
     
           }
     
     
     
    }
    } ;

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Par défaut
    Ca compile ? Non ! Donc c'est pas bon.

    Il ne suffit pas de copier le code d'un thread concurrent...

Discussions similaires

  1. un entier très long
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/11/2007, 13h45
  2. Quel langage pour manipuler des entiers très longs ?
    Par mis_dj dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 10/05/2006, 21h12
  3. Convertir un entier long en string
    Par aroueche dans le forum C
    Réponses: 5
    Dernier message: 12/07/2004, 13h48
  4. tyoe d'entier plus long que 32 bits
    Par LIMODIN dans le forum MFC
    Réponses: 4
    Dernier message: 13/01/2004, 20h08
  5. [TP]Division de longs entiers
    Par Pebg dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 14/12/2003, 12h10

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