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

avec Java Discussion :

Puissance d'un nombre


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Points : 14
    Points
    14
    Par défaut Puissance d'un nombre
    Bonjour,
    Je veux un programme "java“ qui calculé est Ce que un nombre Ecrire ce forme 2 puissance n
    exemple :
    16 ---> 2 puissance 4
    16---> (2)4
    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    À ma connaissance il n'y a pas de méthode directe pour savoir ça, mais ça se programme très facilement. Il y a plusieurs approches.

    - Il y a la méthode théorique :

    Vérifier que le reste de la division par 2 est bien 0, puis faire la division par deux, et recommencer jusqu'à tomber sur 1. Garder le nombre de fois qu'on a fait ça, et on obtient la puissance de 2 du nombre de départ.

    - La méthode par élimination :

    En int (ou en long,) on ne peut représenter que 30 (ou 62) puissances de 2 positives. Pour chacune d'elles, essayer si le nombre est égal à elle. Par exemple partir de 2 et multiplier par deux à chaque fois.

    - Et la méthode d'arithmétique binaire :

    Une puissance de 2, c'est un entier qui contient exactement 1 bit à 1, et tous les autres bits à zéro. Il suffit de compter le nombre de bits à 1. Et s'il y en a bien un seul, il suffit de regarder lequel pour connaître la puissance en question.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2012
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Vous pouvez essayer cette 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
    15
    16
    17
    18
    19
    20
    21
    22
    import java.util.Scanner;
     
    public class Exemple1 {
     
    	public static void main(String[] args) {
    		int n,s=0;
    			Scanner scn = new Scanner(System.in);
    			System.out.println("Faites entrer la valeur de x :");
    			int x = scn.nextInt();
    			if (x%2!=0){
    				System.out.println("On ne peut pas mettre "+x+" sous la forme de 2 exposant !");
    				System.exit(1);}
    			else
    			do{
    				n=x/2;
    				x=n;
    				s++;
    			}
    			while (n!=1);
    			System.out.println("Le résultat est 2 exposant "+s);		
    		}
    	}

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    D'après ce programme, 10 c'est 2 puissance 3.
    Sauf erreur de ma part, 2 puissance 3 ça vaut 8 et seulement 8.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éprouvé Avatar de Grom61736
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 169
    Points : 1 144
    Points
    1 144
    Par défaut
    Et ca ne considère pas le cas 1 = 2^0 non plus. ;-)
    En partant du code de Farouk_T, voici

    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
     
    import java.util.Scanner;
     
    public class Exemple1 {
     
    	public static void main(String[] args) {
    		int s=0;
    			Scanner scn = new Scanner(System.in);
    			System.out.println("Faites entrer la valeur de x :");
    			int x = scn.nextInt();
    			while (x!=1){
    			    if (x%2!=0 && x!=1 ){
    				System.out.println("On ne peut pas mettre "+x+" sous la forme de 2 exposant !");
    				System.exit(1);
                                }
    				x=x/2;
    				s++;
    			}
    			System.out.println("Le résultat est 2 exposant "+s);		
    		}
    	}

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Grom61736 Voir le message
    Et ca ne considère pas le cas 1 = 2^0 non plus. ;-)
    Puisque tu veux jouer au plus fin, ce programme fait un truc bizarre quand on lui donne -4 .

    Edit : mauvais copier/coller de ma part. Il fait un truc bizarre quand on lui donne zéro.
    Et les messages d'erreur sont pas bien clairs .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2012
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Vos remarques sont très constructives

    J'ai apporté quelques modifications et ça devrait traiter tous les cas.. enfin j'espère que j'ai pas sauté un truc ^^'

    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
    import java.util.Scanner;
     
    public class Exemple1 {
     
    	public static void main(String[] args) {
    		int s=0;
    			Scanner scn = new Scanner(System.in);
    			System.out.println("Faites entrer la valeur de x :");
    			int x = scn.nextInt();
    			int n=x;
    			if ((x%2!=0) && (x!=1) || (x==0) || (x<0)) {
    				System.out.println("On ne peut pas mettre "+x+" sous la forme de 2 exposant !");
    				System.exit(1);}
    			else
    				if(x==1){
    					System.out.println("Le résultat est 2 exposant 0");	
    					System.exit(1);}
    			else{
    				while (x!=1){
    				x=x/2;
    				s++;
    			}	
    			if (java.lang.Math.pow(2,s)==n)				
    				System.out.println("Le résultat est 2 exposant "+s);
    			else{
    				System.out.println("On ne peut pas mettre "+n+" sous la forme de 2 exposant !");}	}		
    		}
    	}

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un peu plus direct et sans calculs complexe (voir sujet à erreur si on passe aux Long)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int expo = Integer.numberOfTrailingZeros(x);
    			if ( 1<<expo == x)				
    				System.out.println("Le résultat est 2 exposant "+expo+" = "+x);
    			else{
    				System.out.println("On ne peut pas mettre "+x+" sous la forme de 2 exposant !");}

  9. #9
    Membre éprouvé Avatar de Grom61736
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Février 2013
    Messages : 169
    Points : 1 144
    Points
    1 144
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Puisque tu veux jouer au plus fin, ce programme fait un truc bizarre quand on lui donne -4 .
    Ce n'est pas jouer au plus fin, c'est d'être fidèle à la définition.
    Cependant, il est vrai que ca foire pour les négatifs. Et il ne marche pas non plus pour 1/2 et de manière générale pour tout les 2^(-n).

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Grom61736 Voir le message
    Ce n'est pas jouer au plus fin, c'est d'être fidèle à la définition.
    D'où le smiley ^_^.

    Citation Envoyé par Grom61736 Voir le message
    Cependant, il est vrai que ca foire pour les négatifs. Et il ne marche pas non plus pour 1/2 et de manière générale pour tout les 2^(-n).
    En même temps le problème dit implicitement qu'on ne s'intéresse qu'aux entiers.

    Tu vas me répondre que dans le même genre, il est tout aussi implicite que ce n'est qu'aux entiers positifs (un nombre négatif n'étant jamais puissance d'un positif). Oui, mais en décidant de s'intéresser aux entiers positifs, on va naturellement se caler sur le type int, et utiliser ça comme paramètre de notre méthode int quellePuissanceDeDeux(int nb).
    Une fois cette décision prise, il convient de répondre proprement à toutes les valeurs passées en paramètre, et de ne pas planter sur des valeurs absurdes, mais de juste remonter une erreur.
    Avec des int on n'aura jamais que des entiers, donc pas de 2^(-n). Mais on peut avoir des négatifs, et il convient donc les gérer.

    Edit : oui, bon, il plante pas sur les négatifs, je me suis trompé. Gaffe quand même au message d'erreur.
    Disons qu'il faut pas planter sur zéro.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2012
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    Pour le code que j'ai déjà posté, je pense que tous les cas ont été traités.

    Mais j'avoue que je n'ai pas bien saisi le code posté par tchize_

  12. #12
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Citation Envoyé par Farouk_T Voir le message
    Pour le code que j'ai déjà posté, je pense que tous les cas ont été traités.

    Mais j'avoue que je n'ai pas bien saisi le code posté par tchize_

    Il utilise la méthode d'arithmétique binaire décrite par thelvin.

    le code binaire 00010000 représente le nombre 2 exp 4 (soit 16) codé 1 octet.

    La fonction numberOfTrailingZeros(16) va retourner le nombre de bit à zéro dans le nombre 16 (soit ici 4, on ne compte pas ceux après le 1 car cela ne change pas la valeur du nombre ).

    1 << 4 va effectuer un décalage vers la gauche de 4 bits.

    Appliqué sur le chiffre 1 (soit en binaire 00000001) cela va donner 00010000
    ce qui est bien égal à 16. Donc dans ce cas 16 peut effectivement s'écrire 2 exp 4

    Dans le cas ou il n'y à pas qu'un seul bit a 1 avec par exemple 00010001 (= 17)

    numberOfTrailingZeros(17) va retourner 0 et 1 << 0 va donner 00000001 ce qui est égal à 1. Donc 17 ne peut pas s'écrire sous la forme 2 exp N

    Edit suite à la remarque de tchize_

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Nico02 Voir le message
    numberOfTrailingZeros(17) va retourner 3
    Il va retourner 0

  14. #14
    Membre averti Avatar de toutgrego
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2013
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2013
    Messages : 217
    Points : 350
    Points
    350
    Par défaut
    Salut,

    je propose ç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
     
    public void whatPuissance(int nombre) {
         if (nombre < 0) {
              System.out.println("2^n est positif !");
         } else {
              int count = 0;
              int next = 1;
              while (next < nombre) {
                   next *= 2;
                   count++;
               }
               if (next == nombre) {
                    System.out.println("Nombre = 2^" + count);
               } else {
                    System.out.println("On ne peut écrire " + nombre + " sous forme d'une puissance de 2");
               }
          }
    }
    Dites moi ce que vous en pensez =)
    F*ck it ! Do it !

  15. #15
    Membre expérimenté Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Points : 1 622
    Points
    1 622
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Il va retourner 0
    J’étais persuadé que ça renvoyai le nombre de zéro du code binaire sans la partie de bit à 0 de gauche.

    Méaculpa

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par toutgrego Voir le message
    Salut,

    je propose ça :


    Dites moi ce que vous en pensez =)
    Passe lui Integer.MAX_VALUE et regarde le boucler à l'infini.

  17. #17
    Membre à l'essai
    Inscrit en
    Octobre 2012
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 20
    Points : 21
    Points
    21
    Par défaut
    toutgrego, vous avez procédé autrement et votre programme est très simple à saisir. Cependant, merci beaucoup, j'ai beaucoup appris ^^

    Edit : tchize_, pourquoi le faire s'il vous plaît ?

  18. #18
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Farouk_T Voir le message
    Edit : tchize_, pourquoi le faire s'il vous plaît ?
    Il voulait juste montrer le bug, du genre "plantage total." En général on préférera les corriger que les laisser comme ça.

    (On a eu un exemple des 3 méthodes dont j'ai parlé, yeah \o/)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Farouk_T Voir le message

    Edit : tchize_, pourquoi le faire s'il vous plaît ?
    Ben vu que la moitié des entiers positifs qu'on peux passer à cette méthode la font planter.... Il vaudrait mieux penser à corriger...

Discussions similaires

  1. Réponses: 12
    Dernier message: 10/05/2013, 15h45
  2. calcul du modulo ou puissance d'un nombre
    Par tcheck_vi dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/06/2009, 07h54
  3. Nombres remarquables : Sommes des puissances des sous-nombres
    Par PoZZyX dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 15/11/2007, 15h20
  4. la puissance d'un nombre
    Par dyala dans le forum Débuter
    Réponses: 9
    Dernier message: 12/11/2007, 16h10
  5. Réponses: 25
    Dernier message: 22/02/2007, 15h40

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