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 :

Grands entiers cpp


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2014
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 18
    Par d�faut Grands entiers cpp
    Bonsoir,

    J'ai un exercice � faire et j'aimerai le faire de la mani�re la plus adapt�e.
    Les int et long long int ayant une limite, il s'agit de cr�er une classe en utilisant de la m�moire allou� dynamiquement pour repr�senter et utiliser de tr�s grands entiers (la seule limite sera donc la puissance de l'ordinateur).

    Comment feriez vous? Je pense � utiliser des strings, mais j'aimerai conna�tre votre opinion.

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    la string est de loin le pire des choix possibles

    Perso j'opterais pour des tableaux de long long, et une r�impl�mentation de tous les op�rateurs
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mars 2014
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 18
    Par d�faut
    Int�ressant.
    C'est � dire en mettant un chiffre par case?
    42: t[0]=2, t[1]=4

  4. #4
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par marcelin88 Voir le message
    Int�ressant.
    C'est � dire en mettant un chiffre par case?
    42: t[0]=2, t[1]=4
    Non
    Chaque partie du tableau repr�sente une partie du nombre r�el

    Par exemple, tu choisis le unsigned char comme brique de base, ses valeurs seront 0-255
    pour repr�senter 256 tu auras 255 dans une premi�re case, 1 dans une seconde
    apr�s faut aussi pr�voir un bit de signe

    puis impl�menter toutes les op�rations
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  5. #5
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Citation Envoy� par white_tentacle Voir le message
    Dans le cadre d�une impl�mentation r�elle, oui. Dans le cadre d�un exercice, pas forc�ment (si par string on entend � tableau de caract�res + longueur). �a permet d�avoir une visualisation plus � habituelle � des donn�es, et donc aide � comprendre ce qu�il se passe.
    Non avec une chaine de caract�res ce n'est pas facile:
    1. En C++, on a l'impression que c'est un tableau (� cause de l'op�rateur []), mais la repr�sentation m�moire peut �tre lourde. Par exemple en MFC (si je ne me trompe pas ), un string stockait un pointeur de char et un de wchar et utilisait l'un ou l'autre
    2. Pour les op�rations, � chaque chiffre tu as un d�calage de '0' [caract�re 0]: cela va devenir lourd
    3. Tu peux stocker la valeur r�elle, mais attention � l'utilisation parce que un type string n'est pas pr�vu pour stocker des chiffre/ nombres. Le caract�re 9 ou 10 c'est le beeper



    Citation Envoy� par Bousk Voir le message
    Non
    Chaque partie du tableau repr�sente une partie du nombre r�el

    Par exemple, tu choisis le unsigned char comme brique de base, ses valeurs seront 0-255
    pour repr�senter 256 tu auras 255 dans une premi�re case, 1 dans une seconde
    apr�s faut aussi pr�voir un bit de signe

    puis impl�menter toutes les op�rations
    1. Si tu peux d�couper facilement un int ou un long en morceaux de 256, dans la vraie vie tu vas avoir en entr�e soit une chaine de caract�re soit un tableau, mais tous deux peuvent d�passer la capacit� 4 octects: Bonne chance pour le d�coupage
    2. 256, cela va �tre p�nible parce que tu vas avoir � g�rer les d�bordements: 255 + 1 = 0 et non pas 256
    3. Comment tu vas faire la multiplication?

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    Citation Envoy� par foetus Voir le message
    1. Si tu peux d�couper facilement un int ou un long en morceaux de 256, dans la vraie vie tu vas avoir en entr�e soit une chaine de caract�re soit un tableau, mais tous deux peuvent d�passer la capacit� 4 octects: Bonne chance pour le d�coupage
    2. 256, cela va �tre p�nible parce que tu vas avoir � g�rer les d�bordements: 255 + 1 = 0 et non pas 256
    3. Comment tu vas faire la multiplication?
    En m�me temps, si tu n�es pas capable de r�pondre � ces probl�mes l� (qui soin loin d��tre insurmontables, et sont le principal int�r�t de l�exercice), tu ne r�ussiras jamais � impl�menter une gestion de grands nombres correctes, quelqu�en soit la repr�sentation interne.

    Comme l�a dit Bousk, la repr�sentation � base de tableau de � mettre ici le type le plus grand pour lequel on a des op�rations de base performantes � sera vraisemblablement la meilleure impl�mentation en terme de rapidit� et de compacit� m�moire (quoique je me demande si on n�a pas int�r�t � utiliser le type de taille inf�rieure, ce qui permet de faire les op�rations dans le type de taille sup�rieure sans craindre un d�bordement). Une repr�sentation � base de char d�cimaux ne pose � vrai dire ni plus ni moins de difficult�s (modulo la possibilit� d�avoir des valeurs qui n�ont aucun sens, mais �a �a se r�gle avec des invariants), si ce n�est qu�elle est plus lisible pour l�humain et moins efficace pour la machine.

  7. #7
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Citation Envoy� par foetus Voir le message
    Comment tu vas faire la multiplication?
    C'est assez simple : une multiplication n'est rien d'autre qu'une suite d'additions.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // exemple pour 12*7
    // 12 = 1 1 0 0
    // 7 = 0 1 1 1
     
    result = 0;
    result1 = ((1 1 0 0) * (1)) << 0
    result += result1
    result2 = ((1 1 0 0) * (1)) << 1
    result += result2
    result3 = ((1 1 0 0) * (1)) << 2
    result += result3
    result4 = ((1 1 0 0) * (0)) << 3
    result += result4
    Ainsi il n'y � que des multiplication par 1 et 0.
    On ne manipule jamais de grands nombres (les multiplication par 1 ou 0 ne sont pas faites).
    Les d�calages de bits ne sont pas fait non plus de mani�re "conventionnelle" (avec les op�rateurs << ou >>), mais � la main, tout comme les additions qui agissent sur de grands nombres (qui sont faites par packet de 8/16/32/64/128/... bits), on utilise la carry comme entr�e suppl�mentaire pour la prochaine addition.

    Ce code n'est pas optimal, il faut compter le nombre de bits � 1 et r��crire la multiplication dans le bon sens : ici on aurait 7*12 car 12 poss�de moins de bits � 1 que 7.

    �a reste un algo hautement vectorisable, et si une instruction madd (a = b*c+d) est dispo c'est un bon cas d'utilisation.

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Salut,

    la string est de loin le pire des choix possibles
    Dans le cadre d�une impl�mentation r�elle, oui. Dans le cadre d�un exercice, pas forc�ment (si par string on entend � tableau de caract�res + longueur). �a permet d�avoir une visualisation plus � habituelle � des donn�es, et donc aide � comprendre ce qu�il se passe.

    Perso j'opterais pour des tableaux de long long, et une r�impl�mentation de tous les op�rateurs
    yep.

  9. #9
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    Par d�faut
    Il y a des librairies pour cela: wiki

    Comment cela se passe: avec des tableaux de unsigned char (parce qu'en C/ C++ c'est le plus petit)

    Exemple: le nombre 2741369578 devient |2|7|4|1|3|6|9|5|7|8|

    Pour g�rer le signe, il faut passer par une classe

    Ensuite c'est simple: multiplication, addition et division c'est comme � l'�cole
    La soustraction c'est d�s fois une addition.

    Par contre, les calculs flinguent le CPU

  10. #10
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Salut,

    la string est de loin le pire des choix possibles
    Pas sur, tout depend des criteres. Si l'appli a peu de calcul et beaucoup d'IO, il peut etre sense d'utiliser des string avec un chiffre decimal par caractere (et dans le codage utilise) comme representation.

    Perso j'opterais pour des tableaux de long long,
    La j'ai du mal a voir les criteres qui en font un bon choix. L'utilisation d'un type non signe dont on est capable de calculer un multiplication sans risque de depassement me semble un meilleur choix. La question ensuite est "est-ce qu'on prend tout l'intervalle ou bien on se limite a la plus grande puissance de 10 qui tient dedans" (et le choix n'est pas si simple, on passe facilement plus de 20% du temps a faire des conversions depuis ou vers du decimal, donc une representation pour laquelle c'est peu couteux est sensee, quitte a perdre un peu de memoire) .

    En passant pour la division qui est l'operation la plus compliquee.

Discussions similaires

  1. Affichage de grands entiers
    Par PsychoH13 dans le forum Algorithmes et structures de donn�es
    R�ponses: 6
    Dernier message: 27/07/2007, 11h06
  2. Affichage de grands entiers
    Par PsychoH13 dans le forum C
    R�ponses: 17
    Dernier message: 25/07/2007, 15h48
  3. une biblioth�que de grands entiers
    Par lasmarmann dans le forum Biblioth�ques
    R�ponses: 3
    Dernier message: 02/12/2006, 23h28
  4. Op�ration sur de grands entiers
    Par tutu dans le forum C
    R�ponses: 16
    Dernier message: 24/05/2005, 08h56
  5. Obtenir le plus grand entier !
    Par Gogoye dans le forum C
    R�ponses: 3
    Dernier message: 09/12/2003, 09h40

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