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 :

puissance de 2 en C


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut puissance de 2 en C
    bonsoir,
    j'ai trouvé ce problème

    PROBLEME
    Ecrivez un programme qui lit un entier et affiche la valeur de la plus grande puissance de 2 qui soit inférieure ou égale à ce nombre.

    et j'ai répondu comme ça !

    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
    #include <stdio.h>
    int main() 
    { 
        int N,rep=1;
        printf(" Tapez un entier : ");
        scanf("%d",&N);
        while(N<0)
        {
        printf(" Tapez un entier : ");
        scanf("%d",&N);
        }
        while(rep<N)
        {
                    rep=rep*2;
                    }
        printf(" la reponse est = %d ",rep/2);
     
    return 0; 
    }
    Est-ce que c'est correct et exist-il d'autre manière à résoudre ce problème
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    ton problème revient à trouver le MSB (Most Significant Bit : Bit de poids fort) d'un nombre donné (dans ce cas précis, le nombre étant donné par l'utilisateur) et à n'afficher que celui-ci, tout en gardant -bien sur - sa position.

    Un exemple simple:

    avec x(y) => x base y

    9(10) = 1001(2)

    La puissance de 2 immédiatement inférieure ou égale:

    Pour cela je ne conserve que le bit de poids fort, tous les autres étant mis à zéro.

    Je pars de 1001(2), je ne conserve que le bit de poids fort, tous les autres étant mis à 0:

    1001(2) --> 1000(2) = 8(10)

    Mathématiquement cela revient à trouver le log en base 2 d'un nombre.

    ------------

    plutôt :
    J'aurais utilisé un "unsigned int" plutôt qu'un "int". Le formateur pour scanf devenant alors "%u".

    -----------

    Solution alternative:

    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
     
    #include <stdlib.h>
     
    int main(void)
    {
    	unsigned int num = 0, pow2 = 0, disp;
     
    	printf("Entrez un nombre: ");
    	if (scanf("%u", &num) != 0)
    	{
    		if(num == 0)
    			printf("Pas de solution.\n")
    		else
    		{
    			disp = num;
    			while (num >>= 1) { pow2++;}
    			printf("Resultat :\n\tPuissance de 2 inferieure ou egale a %u: 2^%u = %u\n", disp, pow2, 1 << pow2);
    		}
    	}
     
    	return 0;
    }
    [edit]
    aïe, j'avais oublier de traiter le cas 0, puisqu'il n'existe évidemment pas de puissance de 2 valant 0...

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Bonjour,

    ton problème revient à trouver le MSB (Most Significant Bit : Bit de poids fort) d'un nombre donné (dans ce cas précis, le nombre étant donné par l'utilisateur) et à n'afficher que celui-ci, tout en gardant -bien sur - sa position.

    }
    [/code]

    Merci trés bonne explication .

    j'ai tenté ces deux codes :

    et


    Pourquoi dans l'execution on ne vois pas
    la difference entre les deux !
    et quels sont les criteres pour que je puis choisir la representation de la donnée saisie comme %d %u %hu etc ...

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Citation Envoyé par Dr walid Voir le message
    et


    Pourquoi dans l'execution on ne vois pas
    la difference entre les deux !
    C'est dans le standard du C. Je cite (ISO/IEC 9899:TC3 ; chapitre 5.1.2.2.1 Program startup):

    The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

    int main(void) { /* ... */ }

    or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

    int main(int argc, char *argv[]) { /* ... */ }
    Il n'existe donc que deux définitions standard de "main", citées ci-dessus.

    et quels sont les criteres pour que je puis choisir la representation de la donnée saisie comme %d %u %hu etc ...
    Si tu hésites lorsque tu utilises une fonction, tu peux toujours regarder sur internet en tapant "man xxx" (ou xxx est le nom de la fonction). Sous Unices (Unix, linux, etc.) il existe une commande "man" faites exprès.

    http://linux.die.net/man/3/scanf

    Par exemple, dans cette documentation on voit que:

    u

    Matches an unsigned decimal integer; the next pointer must be a pointer to unsigned int.
    Bon courage dans ton apprentissage

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Il y a aussi une autre manière de le faire : itérer « n &= (n-1) ». Cette méthode avait été posée dans un quizz de recrutement pour je ne sais plus quelle compagnie.

    L'avantage de cette approche est d'annuler automatiquement le LSB du nombre concerné. Le nombre d'itérations pour arriver à zéro est donc exactement le nombre de bits à 1. C'est donc utile pour compter ceux-ci, et pour trouver le MSB si on s'arrête avant la dernière itération.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 59
    Par défaut
    Citation Envoyé par Neitsa Voir le message

    Bon courage dans ton apprentissage
    Merci egalement ici je comprend mieux.


    Citation Envoyé par obsidian Voir le message

    Il y a aussi une autre manière de le faire ...
    merci mais comment je peux le faire l'itération de « n &= (n-1) ». ?

  7. #7
    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 Neitsa Voir le message
    C'est dans le standard du C. Je cite (ISO/IEC 9899:TC3 ; chapitre 5.1.2.2.1 Program startup):

    The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

    int main(void) { /* ... */ }

    or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

    int main(int argc, char *argv[]) { /* ... */ }
    C'est pas bien de couper la suite quand elle est pertinente:
    or equivalent; or in some implementation defined manner.
    En tant que définition,
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int main(void) { ... }
    (ce n'est pas le cas en tant que déclaration, mais les appels récursifs à main() sont plutôt rares en dehors de l'IOCCC). La différence est purement stylistique, et de ce point de vue, je préfère la forme avec void en C, par homogénéité avec les autres fonctions pour lesquelles la différence en tant que déclaration (la forme sans void déclare une fonction avec un nombre indéterminé de paramètres, celle avec void une fonction sans paramètres) force le compilateur à signaler une erreur aux appels incorrects.

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Il y a aussi une autre manière de le faire : itérer « n &= (n-1) ». Cette méthode avait été posée dans un quizz de recrutement pour je ne sais plus quelle compagnie.

    L'avantage de cette approche est d'annuler automatiquement le LSB du nombre concerné. Le nombre d'itérations pour arriver à zéro est donc exactement le nombre de bits à 1. C'est donc utile pour compter ceux-ci, et pour trouver le MSB si on s'arrête avant la dernière itération.
    C'est une méthode que l'on utilise généralement pour du bit counting.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    C'est une méthode que l'on utilise généralement pour du bit counting.
    C'est ce que j'ai dit.

Discussions similaires

  1. Entre technologie et puissance: duel 6800Ultra & X850xt
    Par DarkOcean dans le forum Composants
    Réponses: 5
    Dernier message: 03/02/2005, 17h11
  2. [LG]Puissance et Indice
    Par luno2545 dans le forum Langage
    Réponses: 2
    Dernier message: 08/05/2004, 10h01
  3. [LG]fonction puissance en pascal
    Par le 27 dans le forum Langage
    Réponses: 8
    Dernier message: 13/12/2003, 23h21
  4. x² et puissance de x par récurrence
    Par olivieram dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 15/12/2002, 23h59
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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