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 :

Problème de conversion dans un format numérique


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Points : 25
    Points
    25
    Par défaut Problème de conversion dans un format numérique
    Bonjour à tous,

    J'ai un nombre ENTIER pouvant être constitué aux maximum de 36 chiffres, dans une chaine de caractères.

    J'ai une opération arithmétique à faire dessus (modulo 97), et je dois donc pour cela convertir ma chaine dans un format numérique. le problème étant que le type 'int' est trop faible au vu de sa taille, tout comme le type long.

    J'ai également essayé avec un double lors du cast de ma chaine, mais celui-ci me convertit assez bizarrement ma chaine.

    J'ai donc ceci :
    String maChaine = "123456789123456789123456789123456789";

    Comment puis-je la diviser par 97 ?

    Merci d'avance

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Tu peux éventuellement utiliser une bibliothèque destinée au calcul en précision non bornée (gmp par exemple), mais si tu n'a besoin que du modulo (et pas du résultat de la division), ce n'est pas nécessaire. Il suffit de se souvenir quel modulo est linéaire et donc ceci devrait faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int mod97(std::string const& n) 
    {
       int result = 0;
       for (std::string::size_type i = 0; i < n.size(); ++i) {
          assert(isdigit(n[i]));
          result = (result * 10 + n[i] - '0') % 97;
       }
       return result;
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Je n'ai pas tout saisi, ne faut il pas faire un += sur result dans la boucle , au lieu d'un simple = ?

    Merci de m'éclairer

    Car la valeur renvoyée par result correspond ici au calcul effectué seulement au dernier tour de boucle.

    De plus je travaille en C++ Builder est ce que la fonction size() dans votre code, sur la chaine de caractères renvoie la taille de la chaine ? (Dans ce cas j'utiliserais la fonction Length() en Builder).

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Ju2Pom Voir le message
    Je n'ai pas tout saisi, ne faut il pas faire un += sur result dans la boucle , au lieu d'un simple = ?
    Non, mais result est utilisé pour calculer la valeur suivante.

    De plus je travaille en C++ Builder est ce que la fonction size() dans votre code, sur la chaine de caractères renvoie la taille de la chaine ?
    Oui.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Points : 25
    Points
    25
    Par défaut
    Merci , effectivement ça semble marcher, même s'il est vrai que je n'ai pas saisi toutes les subtilités de cet algo

    Quoi qu'il en soit ça me convient parfaitement

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    si ca t'interesse, tu peut aussi coder le mod avec les algorithm

    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
    int mod(const std::string const& n,const int const& mod) 
    {
       struct myMod
    	   {
    		explicit myMod(const int const &  const mod): m_result (0),m_mod(mod){};
    		void operator()(const char const & c)
    		   {
    			assert(c>='0' && c<='9');
    		   m_result = (m_result * 10 + c - '0') % m_mod;
    		   }
     
    		int  m_result ;
    		int m_mod;
    		};
       return std::for_each(n.begin(),n.end(),myMod(mod)).m_result;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de conversion de dimension dans BUSINESS OBJECT
    Par greatmaster1971 dans le forum Deski
    Réponses: 4
    Dernier message: 28/04/2014, 13h15
  2. [WD-2003] Problème de majuscules dans le format de la police de caractère
    Par Agnostik dans le forum Word
    Réponses: 2
    Dernier message: 03/11/2011, 13h02
  3. Problème de conversion de format image dans DirectShow
    Par grob1212 dans le forum DirectX
    Réponses: 4
    Dernier message: 19/06/2006, 20h16
  4. [vbnet] problème de conversion dans une datagrid
    Par Jsh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/09/2005, 12h40
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

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