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 :

Tester qu'une variables est une puissance de x


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Points : 151
    Points
    151
    Par défaut Tester qu'une variables est une puissance de x
    Bonjour,

    je cherche a faire un petit test sur une variable, m'assurer que c'est bien une puissance d'une certaine valeur et de plus que cette valeur appartient a un intervalle de puissance

    de x^2 a x^10 par exemple.

    En faisant une methode qui prend chaque valeur et compare, du style
    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
    enum
    {
        STATUS_OK = 1,
        STATUS_ERR = 0
    }
    const int isPowerOf(int toTest, int powBase, int int_max , int int_min=1)
    {
        int powValue = x;
        while(powValue < int_max)
        {
            if(toTest == powBase) return STATUS_OK;
            powValue = powValue *powBase;
        }
        return STATUS_ERR;
    }
    Ceci est un rapide exemple fait en ligne, soyez indulgent...

    Existe t il une fonction predefinie dans la stl ou il suffit de donner la valeur, et la valeur de base (x) pour x^y pour qu'elle retourne un bool par exemple?

    Merci du coup de pouce

    rikau2

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Sans tester toutes les possibilités tu pourrais faire un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Si ( x^ymin < valeur && valeur > x^ymax && valeur%x == 0)
    {
    OK;
    }
    soit "si ma valeur est comprise entre ma puissance de x mini et ma puissance de x maxi, et que ma valeur est bien une puissance de x alors c'est bon"

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Citation Envoyé par koopajah
    (...) est bien une puissance de x (...)
    Ca me parait louche ça.

    MAT.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    rikau2 :
    m'assurer que c'est bien une puissance d'une certaine valeur et de plus que cette valeur appartient a un intervalle de puissance
    Passer par les logarithmes ?!
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Pour le retour de ta fonction utilise le type bool (à mon avis)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool isPowerOf(int toTest, int powBase, int int_max , int int_min=1) {}

  6. #6
    Membre habitué
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Points : 151
    Points
    151
    Par défaut
    valeur%x == 0
    En effet ca me parait bizarre a moi aussi car 2%2 = 0, 4%2 =0 6%2 =0 mais 6 n'est pas une puissance de 2...
    Pour le retour de ta fonction utilise le type bool (à mon avis)
    C'est l'architecture générale de mon projet qui le veut.
    Je cherche a tester que ma valeur est soit 1,2,4,8,16,32,64,128 mais je cherche plus un algo qui me permettrai de résoudre ce type de probleme de manière plus généralisée.

    Dans l'attente de réponse....

    ps: Je veux a tout prix eviter le if(x== 1 || x==2 || ....

    Cdt

    rikau2

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    pour ton projet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int nombre_a_tester;
    int test = 1;
     
    while (test < nombre_a_tester)
    {
      test *= 2;
    }
     
    if (test == nombre_a_tester)
    {
      //c'est une puissance de 2!
    }

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    J'avais besoin y'a quelque temps d'une fonction pour vérifier si une valeur était bien une puissance de 2. Je sais que ça ne répond que partiellement au problème posé mais voilà le bout de code qui me parît imparfait que j'avais fait, si ça peut aider...
    Je voulais éviter d'appeler des logs (calculs relativement longs et imprécisions éventuels des calculs flottants), mais je ne vois pas comment faire pour éviter une boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    inline int log2n(int n)
    {
      for (int m=1, l=0; true; ++l, m*=2)
        if (m>=n)
        {
          //if ((1<<l)!=n) throw error("n is not a power of 2");
          return l;
        }
    }

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par rikau2
    En effet ca me parait bizarre a moi aussi car 2%2 = 0, 4%2 =0
    Le modulo n'est peut-être pas si inintéressant, il peut quand même servir à exclure pas mal de cas (1 cas sur 2 pour les puissance de 2) avant de commencer à faire une boucle qui ferait perdre pas mal de temps (c'est relatif) de calcul.

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Pour tester si X est une puissance de deux... il y a plus simple:

    (X & (X-1)) == 0)

    Pour avoir le log base-2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int low_log2int(int n)
    {
        assert(n > 0);
        int ret = 0;
        while (n>>=1) ++ret; // on peut utiliser la rotation car n > 0 !
        return ret;
    }
    Pour avoir la puissance de 2 immediatement supérieure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int high_log2int(int n)
    {
        assert(n > 0);
        return (n == 1) ? 0 : low_log2int(n-1)+1;
    }

    Pour les autres puissances, ca dépend... j'essaierai quand même le coup du logarithme... sinon la division entier par entier est assez rapide...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    (X & (X-1)) == 0)
    joli !

Discussions similaires

  1. Tester si le contenu d'une variable est en majuscule
    Par diombo dans le forum VBA Access
    Réponses: 8
    Dernier message: 16/01/2019, 15h45
  2. [Débutant] Affecter une variable d'une classe C# à une variable Javascript
    Par SultanGeek dans le forum C#
    Réponses: 0
    Dernier message: 20/06/2015, 20h42
  3. Tester si une variable est une lambda fonction
    Par rambc dans le forum Général Python
    Réponses: 2
    Dernier message: 15/11/2009, 18h52
  4. Réponses: 3
    Dernier message: 25/10/2007, 10h25
  5. Réponses: 2
    Dernier message: 10/06/2006, 17h13

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