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 à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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 éprouvé
    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 : 39
    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
    Points : 1 067
    Points
    1 067
    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
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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.)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Est ce pour un exercice? Parce que sinon autant utilisé la class vector de la STL.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    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 à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Il faut définir l'operator[] pour ton array...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    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 à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    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 chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  16. #16
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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 éprouvé
    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 : 39
    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
    Points : 1 067
    Points
    1 067
    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
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

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

  19. #19
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 10
    Points
    10
    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
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    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, 14h45
  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, 22h12
  3. Convertir un entier long en string
    Par aroueche dans le forum C
    Réponses: 5
    Dernier message: 12/07/2004, 14h48
  4. tyoe d'entier plus long que 32 bits
    Par LIMODIN dans le forum MFC
    Réponses: 4
    Dernier message: 13/01/2004, 21h08
  5. [TP]Division de longs entiers
    Par Pebg dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 14/12/2003, 13h10

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