tester si un chiffre est paire ou impaire

tester si un chiffre est paire ou impaire - PHP - Programmation

Marsh Posté le 26-10-2005 à 12:25:28    

Bonjour,
 
Existe t il en php une fonction qui retourne si une variable numérique est paire ou impaire ?


---------------
.:: Feed-Back  ::. Choisis un travail que tu aimes, et tu n'auras pas à travailler un seul jour de ta vie.
Reply

Marsh Posté le 26-10-2005 à 12:25:28   

Reply

Marsh Posté le 26-10-2005 à 12:27:46    

DrWatson a écrit :

Bonjour,
 
Existe t il en php une fonction qui retourne si une variable numérique est paire ou impaire ?


variable%2


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-10-2005 à 12:32:01    

merci mais y'a moyen d'avoir la traduction stp ? google n'est pas mon ami sur ce coup.
 
Le % en php avec la valeur 2 équivaut à voir si le chiffre est divisble par 2 en restant entier et donc paire :??:


---------------
.:: Feed-Back  ::. Choisis un travail que tu aimes, et tu n'auras pas à travailler un seul jour de ta vie.
Reply

Marsh Posté le 26-10-2005 à 12:33:06    

un truc du genre

Code :
  1. if (variable%2) echo "paire";
  2. else echo "impaire";


 
doit donc fonctionner ?


Message édité par DrWatson le 26-10-2005 à 12:33:15

---------------
.:: Feed-Back  ::. Choisis un travail que tu aimes, et tu n'auras pas à travailler un seul jour de ta vie.
Reply

Marsh Posté le 26-10-2005 à 12:35:47    

le modulo (% en php) te retourne le reste de la division (par 2 dans ton cas)
si tavariable%2 = 0 ==> tavariable est paire

Reply

Marsh Posté le 26-10-2005 à 12:37:08    

Non, c'est l'inverse, % c'est l'opérateur modulo [:petrus75]
 
a%b donne le reste de la division de a par b (sur les divisions d'entiers).
 
Donc n%2 avec n pair donne toujours "0", et n%2 avec n impair donne "1".
 
Donc  

if(n%2)
    echo "impair"
else
    echo "pair"


Message édité par masklinn le 26-10-2005 à 12:37:29

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-10-2005 à 12:44:17    

en tout cas c'est bien ce dont j'avais besoin merci bcp :) (en fait c'est pour alterner la couleur de fond de message un sur deux. Est ce que c'est comme ça que font les forums ? un message sur deux change de couleur, ça doit bien se baser sur ce genre de principe ...


---------------
.:: Feed-Back  ::. Choisis un travail que tu aimes, et tu n'auras pas à travailler un seul jour de ta vie.
Reply

Marsh Posté le 26-10-2005 à 12:45:25    

Ca dépend, ça c'est la manière la plus propre de le faire, mais certains mettent en place un compteur et le modifient à chaque opération (genre un compteur oscillant entre 1 et -1, négativé à chaque tour de boucle)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 26-10-2005 à 12:53:55    

DrWatson a écrit :

en tout cas c'est bien ce dont j'avais besoin merci bcp :) (en fait c'est pour alterner la couleur de fond de message un sur deux. Est ce que c'est comme ça que font les forums ? un message sur deux change de couleur, ça doit bien se baser sur ce genre de principe ...


tout à fait, et en faisant justement ta recherche sur le alterner 1 fois sur 2, je pense que tu tomber direct sur la solouce, déjà abordée sur ce forum :P


---------------
- Xav - ...There are no crimes when there are no laws... -- Xav's World
Reply

Marsh Posté le 27-10-2005 à 01:24:27    

... Putain les autodidactes ils font comment à part  avoir 5 neurones en plus ...
 
Google est ton ami si tu sais t'en servir ;)

Reply

Marsh Posté le 27-10-2005 à 01:24:27   

Reply

Marsh Posté le 08-11-2005 à 17:14:07    

leflos5 a écrit :

... Putain les autodidactes ils font comment à part  avoir 5 neurones en plus ...
 
Google est ton ami si tu sais t'en servir ;)


 
 
toi tu vas me sortir que tu n'as jamais rien demandé à personne et que tu es autodidacte dans tous les domaines  :sarcastic: vieux rabajoie va

Reply

Marsh Posté le 08-11-2005 à 20:37:45    

DrWatson a écrit :

toi tu vas me sortir que tu n'as jamais rien demandé à personne et que tu es autodidacte dans tous les domaines  :sarcastic: vieux rabajoie va


Si mais je cherche toujours avant, je me suis toujours pris la tête pendant des heures tant que je comprennais pas ou que ça marchait pas ;)
 
Donc avant de demander, c'est un problème de maths donc on cherche la solution mathématique avant de la modéliser et de mettre 3s à trouver que modulo en php comme beaucoup de langages c'est %...
 
La réaction était démesurée je l'accorde, je devais être fatigué :P

Reply

Marsh Posté le 08-11-2005 à 22:30:41    

sinon y'a ça

Code :
  1. if($var&1) {
  2. //impaire
  3. }else{
  4. //paire
  5. }



---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 09-11-2005 à 14:11:06    

DrWatson a écrit :

Bonjour,
 
Existe t il en php une fonction qui retourne si une variable numérique est paire ou impaire ?


 
 
amusant ;)

Code :
  1. if(pow(-1^$chiffre)==1) {
  2. c paire
  3. }
  4. else
  5. { c po paire }

Reply

Marsh Posté le 09-11-2005 à 15:18:41    

On peut faire encore pire : :D  
 

Code :
  1. $pair = false;
  2. for($i = 0; $i < 2147483647 && !$pair; $i += 2) {
  3.     $pair = ($nombre == $i);
  4. }
  5. echo $chiffre
  6. . ($pair ? ' est ' : ' n\'est pas ')
  7. . 'pair';


 
Blague à part, la solution de zapan66 (ET binaire avec 00000001) me parait un petit poil plus efficace que le modulo 2.
 
Edit (ajout 2° condition arrêt boucle) suite à la pertinente ramrque de omega2  :ange:

Message cité 1 fois
Message édité par DjMerguez le 09-11-2005 à 15:38:48
Reply

Marsh Posté le 09-11-2005 à 15:32:05    

DjMerguez > Marche pas ton truc vu qu'il dire que c'est pas pair sauf si $nombre=2147483646
 
Le coup du ET binaire me semble le mieux en effet même si j'ai pas fait avec me rapellant jamais quel est l'opérateur qui fait ça. :lol:

Reply

Marsh Posté le 09-11-2005 à 15:45:37    

DjMerguez a écrit :

me parait un petit poil plus efficace que le modulo 2.


En termes de perfs [:petrus dei]
 
J'dois dire que si t'en es à comparer les perfs de l'arithmétique booléenne par rapport au modulo, t'es pas censé faire du PHP hein [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-11-2005 à 15:52:15    

Hummm j'viens de penser à une autre technique pour trouver ca :

Code :
  1. <?
  2. if ( ceil($num/2) == $num/2 ) {
  3.    echo "C'est pair";
  4. }else{
  5.     echo "C'est pas pair";
  6. }
  7. ?>

Message cité 1 fois
Message édité par dwogsi le 09-11-2005 à 15:52:54

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 09-11-2005 à 16:46:13    

dwogsi: c'est comme ca que je faisait en actionscript (enfin de memoire je comparais Math.floor() et Math.ceil())
 
je sais c'est nul mais la prog en autodidacte c'est rarement beau  :D  


---------------
D3
Reply

Marsh Posté le 09-11-2005 à 16:50:32    

Bah non c'est pas nul, ca veut dire que plutôt que d'utiliser des choses toutes faites tu est capable de trouver une solution avec d'autres outils. Certains dirons que c'est pas "optimisé" mais bon pour ce que ca prend une division et une comparaison....
 
et puis t'en fait une fonction comme ca t'es tranquile! Genre :
 

Code :
  1. <?
  2. function pair($num) {
  3.     if ( ceil($num/2) == $num/2 ) {
  4.        Return TRUE;
  5.     }else{
  6.         Return FALSE;
  7.     }
  8. }
  9. ?>


 
Je sais je sais c'est complétement innutile...
 
Au fait, même quand on est autodidacte, on peut avoir les bonnes solutions. Mais il faut savoir être patient!

Message cité 1 fois
Message édité par dwogsi le 09-11-2005 à 16:51:46

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 09-11-2005 à 18:35:22    

;)


---------------
D3
Reply

Marsh Posté le 09-11-2005 à 19:53:12    

masklinn a écrit :

J'dois dire que si t'en es à comparer les perfs de l'arithmétique booléenne par rapport au modulo, t'es pas censé faire du PHP hein


 
Je suis bien d'accord que dans la plupart des cas c'est pas très rentable de passer du temps à optimiser du PHP, mais, dans ce cas, si le code sert par exemple à changer la couleur des TR d'une table qui a des milliers de lignes, ça vaut la peine de chercher à gratter un peu de charge processeur.

Reply

Marsh Posté le 09-11-2005 à 20:17:05    

:lol: merci les gars pour le concours, si avec ça j'ai pas ce que je veux ;)
 
donc pour vous la soluce de zapan reste la meilleure

Reply

Marsh Posté le 09-11-2005 à 22:22:44    

dwogsi a écrit :


Code :
  1. <?
  2. function pair($num) {
  3.     if ( ceil($num/2) == $num/2 ) {
  4.        Return TRUE;
  5.     }else{
  6.         Return FALSE;
  7.     }
  8. }
  9. ?>



Tu te complique la vie !

Code :
  1. <?
  2. function pair($num) {
  3.     return ( ceil($num/2) == $num/2 );
  4. }
  5. ?>


et donc avec ma solution :  

Code :
  1. <?php
  2. function isPair($num) { return ($num&1); }
  3. ?>


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 09-11-2005 à 22:27:28    

DrWatson a écrit :

donc pour vous la soluce de zapan reste la meilleure


c'est la meilleure pour zapan et DjMerguez ;
 
moi je prefère la solution que j'ai toujours utilisé :

Code :
  1. switch($num) {
  2.     case:0
  3.         // pair;
  4.         break;
  5.     case:1
  6.         // impair;
  7.         break;
  8.     case:2
  9.         // pair;
  10.         break;
  11.     case:3
  12.         // impair;
  13.         break;
  14.     // etc ...
  15. }


 :lol:  :lol:  :lol:


---------------
The Rom's, à votre service
Reply

Marsh Posté le 09-11-2005 à 22:31:17    

dwogsi a écrit :

Hummm j'viens de penser à une autre technique pour trouver ca :

Code :
  1. <?
  2. if ( ceil($num/2) == $num/2 ) {
  3.    echo "C'est pair";
  4. }else{
  5.     echo "C'est pas pair";
  6. }
  7. ?>



Ouais enfin là on perd en visibilité et on tape des appels de fonctions pour rien (par rapport au modulo ou à l'arithmétique binaire), donc ça n'a vraiment aucun intérêt, que des inconvénients


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 10-11-2005 à 03:06:08    

masklinn a écrit :

Ouais enfin là on perd en visibilité et on tape des appels de fonctions pour rien (par rapport au modulo ou à l'arithmétique binaire), donc ça n'a vraiment aucun intérêt, que des inconvénients


JE pense plus que ce post a dévié pour dire que c'est simplement un problème mathématique qui n'a pas une solution unique en terme de résultat ;)
 
Une preuve qu'il faut réfléchir mais que la solution n'est pas unique, la classe n'est pas toujours la même, l'efficacité non plus mais preuve est que tout le monde peut trouver un truc qui plus est marant juste en méditant 5 minutes ;)
 
JE vois ça comme ça moi :)

Reply

Marsh Posté le 11-11-2005 à 18:18:48    

si j'ai fais un topic ct pas pour me fabriquer une usine à gaz tu t'en doutes bien. Sachant qu'il existe un opérateur dédié à ça en partie, je suis bien content qu'on me l'ait appris / réappris
 

Reply

Marsh Posté le 11-11-2005 à 23:07:29    

masklinn a écrit :

Ca dépend, ça c'est la manière la plus propre de le faire, mais certains mettent en place un compteur et le modifient à chaque opération (genre un compteur oscillant entre 1 et -1, négativé à chaque tour de boucle)


Ou alors $i=1-$i avec $i=0 ou 1 à l'initialisation. $i sera toujours à 1 ou 0.

Reply

Marsh Posté le 12-11-2005 à 14:14:52    

Au fait, pour deux couleurs, personne n'a pensé à l'utilisation d'un booléen? if ($bool) {couleur1}else{couleur2}.
Aprés, pour passer d'une couleur à l'autre, il suffit de faire $bool = ! $bool;
 
Je me demande si c'est pas même plus rapide qu'une incrémentation suivit d'un ou booléen.

Reply

Marsh Posté le 12-11-2005 à 14:30:09    

switch (IsTrue(variable%2)) {
   case true: return true;
   case false: return false;
   default: return FileNotFound;
}
 
Les connaisseurs apprécieront :o

Reply

Marsh Posté le 12-11-2005 à 14:36:10    

omega2 a écrit :

Au fait, pour deux couleurs, personne n'a pensé à l'utilisation d'un booléen? if ($bool) {couleur1}else{couleur2}.
Aprés, pour passer d'une couleur à l'autre, il suffit de faire $bool = ! $bool;
 
Je me demande si c'est pas même plus rapide qu'une incrémentation suivit d'un ou booléen.


 
Ouais, c'est ça que je fais quand je dois alterner entre deux états, perso. [:spamafote]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-11-2005 à 14:39:14    

Elmoricq a écrit :

switch (IsTrue(variable%2)) {
   case true: return true;
   case false: return false;
   default: return FileNotFound;
}
 
Les connaisseurs apprécieront :o


Code :
  1. Bool IsPair(int val) {
  2.     switch(IsTrue(val&1)) {
  3.         case true: return return_false();
  4.         case fase: return return_true_if_false_and_vice_versa(return_false());
  5.         default: return FileNotFound;
  6.     }
  7. }


 [:aloy]


Message édité par masklinn le 12-11-2005 à 14:39:47

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-11-2005 à 18:52:04    

Ça part pas un peu en couil*** votre truc ?
 
On peut pas faire ça tout simplement ?
 

Code :
  1. echo if ($nb%2) ? 'paire' : 'impaire';


 
Paracetamol

Reply

Marsh Posté le 12-11-2005 à 20:58:50    

Paracetamol a écrit :

Ça part pas un peu en couil*** votre truc ?


t'es pas un connaisseur c'est tout [:spamafote]  

Citation :

On peut pas faire ça tout simplement ?
 

Code :
  1. echo if ($nb%2) ? 'paire' : 'impaire';



Comme suggéré plus haut par zapan, mieux vaut passer par le booléen: n&1 ? "impair" : "pair"
C'est tout aussi lisible et (en python) c'est 20% plus rapide.
 
(sans compter que ton machin est faut, soit tu utilises if soit tu utilises l'opérateur ternaire, mais pas les deux)à

Reply

Marsh Posté le 12-11-2005 à 21:21:46    

Moi perso, je ferais :
$compteur=1;
for gningningnin
{
echo '<div class="macss'.$compteur.'">';
$compteur++; if ($compteur>2) {$compteur=1)
}

Reply

Marsh Posté le 12-11-2005 à 21:30:27    

The-Shadow a écrit :

Moi perso, je ferais :
$compteur=1;
for gningningnin
{
echo '<div class="macss'.$compteur.'">';
$compteur++; if ($compteur>2) {$compteur=1)
}


Code :
  1. for($i=0; $i<cond; $i++) {
  2.     echo '<div class="'.($i&1 ? 'odd' : 'even').'">';
  3.     /* snip */
  4. }


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-11-2005 à 03:09:23    

masklinn a écrit :

Code :
  1. for($i=0; $i<cond; $i++) {
  2.     echo '<div class="'.($i&1 ? 'odd' : 'even').'">';
  3.     /* snip */
  4. }



Yeah!!! It Suks !!!

Reply

Marsh Posté le 13-11-2005 à 12:40:13    

Bonjour la lisibilité, mais pourquoi pas.


Message édité par The-Shadow le 13-11-2005 à 12:40:24
Reply

Marsh Posté le 30-03-2006 à 18:00:41    

et le zéro il est consiéré comme quoi?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed