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
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
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.
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); } }
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.
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); } }
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 !");} } } }
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 !");}
D'où le smiley ^_^.
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.
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_
Salut,
je propose ça :
Dites moi ce que vous en pensez =)
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"); } } }
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 ?
Partager