Vérifiez si le nombre est pair ou impair

129

Comment déterminer si un nombre donné est pair ou impair? Je voulais comprendre cela depuis longtemps maintenant et je ne suis allé nulle part.

Josh
la source

Réponses:

202

Vous pouvez utiliser l'opérateur de module, mais cela peut être lent. Si c'est un entier, vous pouvez faire:

if ( (x & 1) == 0 ) { even... } else { odd... }

Ceci est dû au fait que le bit faible sera toujours défini sur un nombre impair.

lucasmo
la source
23
Je suis toujours étonné que les gens préfèrent le module à la simple vérification du premier bit du nombre. De toute évidence, si le premier bit est défini, le nombre doit être impair. C'est généralement plus rapide et cela se lit aussi bien à mon avis. Je pense que la raison pour laquelle les autres ne le préfèrent pas au module se résume à un manque de compréhension du binaire.
écraser le
5
@dtech Je pense que vous comprenez mal le sens de l'optimisation prématurée. Si vous savez à l'avance qu'une méthode est plus performante qu'une autre, il n'est pas prématuré d'utiliser la méthode la plus performante. C'est intelligent. Cela dit, mon commentaire portait davantage sur la façon dont la vérification du premier bit est plus logique que l'utilisation du module lors de la simple vérification des paires / impaires. Le problème est que de nombreux programmeurs ne comprennent pas ce que fait l'une ou l'autre méthode et suivent simplement des tutoriels.
écraser
54
@crush n % 2 == 0signifie sémantiquement Divide by 2 and check if the remainder is 0, ce qui est beaucoup plus clair que n & 1 == 0ce que signifie Zero all the bits but leave the least significant bit unchanged and check if the result is 0. L'amélioration de la clarté du premier vaut la surcharge (probablement inexistante). C'est ce que je voulais dire par optimisation prématurée. Si quelque chose est lent et que vous le profilez dans cette partie, le changement n % 2en n & 1est certainement justifié, mais le faire à l'avance ne l'est pas. En général, travailler avec les opérateurs de bits est une mauvaise idée avant le profilage.
dtech
18
@dtech Tout d'abord, votre opinion est complètement subjective. Deuxièmement, vous ne comprenez toujours pas ce que signifie «optimisation prématurée». C'est une micro optimisation, bien sûr. Ce n'est pas une optimisation prématurée. L'optimisation prématurée révise le code existant avec des «optimisations» sans d'abord profiler le code existant pour voir qu'il est inefficace. Cependant, savoir à l'avance qu'écrire du code d'une manière plutôt que d'une autre est plus efficace et choisir d'utiliser le code le plus efficace n'est PAS une optimisation prématurée. C'est votre opinion subjective qui n % 2 == 0est plus propre que n & 1 == 0.
écraser
15
Je voudrais juste signaler aux gens qui viennent ici que l'utilisation de l'opérateur modulo est très bien, mais si vous l'utilisez pour tester l'étrangeté, écrivez n% 2! = 0, pas n% 2 == 1, car ce dernier ne fonctionne pas pour les nombres négatifs en Java.
Jxek
98
if((x%2)==0)
   // even
else
   // odd
poy
la source
30

Si le reste lorsque vous divisez par 2 est égal à 0, il est pair. %est l'opérateur pour obtenir un reste.

Ryan Stewart
la source
12
L'opérateur% est appelé modulo.
Anthony
4
@Anthony: En fait, c'est "l'opérateur de reste" .
Ryan Stewart
3
Le terme mathématique est module, et il a une applicabilité plus large que l'obtention du reste. (A % B)lui-même peut être utilisé comme une expression, et c'est là que les choses deviennent amusantes.
Stefan Kendall
2
@Stefan: Je n'insisterai pas sur ce point, mais les mathématiciens ont tendance à faire remarquer qu'en arithmétique modulaire, le module et le reste ne sont pas la même chose .
Ryan Stewart
2
@StefanKendall Vérifiez la spécification du langage Java # 15.17.3 . Google n'est pas une référence normative.
Marquis of Lorne
24

L'opérateur de reste,%, vous donnera le reste après avoir divisé par un nombre.

Il en n % 2 == 0sera de même si n est pair et faux si n est impair.

Phil
la source
21

Chaque nombre pair est divisible par deux, qu'il s'agisse d'un nombre décimal (mais le nombre décimal, s'il est présent, doit également être pair). Vous pouvez donc utiliser l' %opérateur (modulo), qui divise le nombre à gauche par le nombre à droite et renvoie le reste ...

boolean isEven(double num) { return ((num % 2) == 0); }
fireshadow52
la source
1
«Peu importe si c'est une décimale» n'a pas de sens. Decimal est une base. Voulez-vous dire "contient une partie fractionnaire"?
Marquis of Lorne
4

je recommanderais

Java Puzzlers: Traps, Pitfalls, and Corner Cases Book par Joshua Bloch et Neal Gafter

Il y a une brève explication comment vérifier si le nombre est impair. Le premier essai est quelque chose de similaire à ce que @AseemYadav a essayé:

public static boolean isOdd(int i) {
     return i % 2 == 1;
}

mais comme cela a été mentionné dans le livre:

lorsque l'opération de reste retourne un résultat différent de zéro, elle a le même signe que son opérande gauche

donc généralement, lorsque nous avons un nombre impair négatif, 1nous obtiendrons -1au lieu de cela i%2. Nous pouvons donc utiliser la solution @Camilo ou simplement faire:

public static boolean isOdd(int i) {
     return i % 2 != 0;
}

mais généralement la solution la plus rapide utilise l'opérateur AND comme @lucasmo écrire ci-dessus:

public static boolean isOdd(int i) {
     return (i & 1) != 0;
}

@Edit Il vaut également la peine de souligner Math.floorMod(int x, int y);ce qui traite bien le dividende négatif mais peut également revenir -1si le diviseur est négatif

Michu93
la source
2

Fonctionne pour les nombres positifs ou négatifs

int start = -3;
int end = 6;

for (int val = start; val < end; val++)
{
    // Condition to Check Even, Not condition (!) will give Odd number
    if (val % 2 == 0) 
    {
        System.out.println("Even" + val);
    }
    else
    {
        System.out.println("Odd" + val);
    }
}
Kiran G
la source
2

Le bit le moins significatif (le plus à droite) peut être utilisé pour vérifier si le nombre est pair ou impair. Pour tous les nombres impairs, le bit le plus à droite est toujours 1 dans la représentation binaire.

public static boolean checkOdd(long number){
   return ((number & 0x1) == 1);
}

la source
2

Ce programme suivant peut gérer de grands nombres (nombre de chiffres supérieur à 20)

package com.isEven.java;
import java.util.Scanner;

public class isEvenValuate{

public static void main(String[] args) {            

        Scanner in = new Scanner(System.in);
        String digit = in.next();

        int y = Character.getNumericValue(digit.charAt(digit.length()-1));

        boolean isEven = (y&1)==0;

        if(isEven)
            System.out.println("Even");
        else
            System.out.println("Odd");

    }
}

Voici la sortie:

  122873215981652362153862153872138721637272
  Even
Titus Roby K
la source
1

Vous pouvez utiliser l'opérateur de module, mais cela peut être lent. Un moyen plus efficace serait de vérifier le bit le plus bas car cela détermine si un nombre est pair ou impair. Le code ressemblerait à ceci:

public static void main(String[] args) {        
    System.out.println("Enter a number to check if it is even or odd");        
    System.out.println("Your number is " + (((new Scanner(System.in).nextInt() & 1) == 0) ? "even" : "odd"));        
}
Slap Chukandar Singh
la source
1

Vous pouvez faire comme ceci:

boolean is_odd(int n) {
    return n % 2 == 1 || n % 2 == -1;
}

En effet, Java a dans son fonctionnement modulo le signe du dividende, le côté gauche: n. Donc, pour les dividendes négatifs et positifs, le modulo en a le signe.

Bien sûr, l'opération au niveau du bit est plus rapide et optimisée, il suffit de documenter la ligne de code avec deux ou trois mots courts, ce qui le fait pour la lisibilité.

Camilo
la source
Il est appelé l' opérateur de reste , pas l'opérateur modulo.
Marquis de Lorne
1

Un autre moyen facile de le faire sans utiliser la condition if / else (fonctionne pour les nombres positifs et négatifs):

int n = 8;
List<String> messages = Arrays.asList("even", "odd");

System.out.println(messages.get(Math.abs(n%2)));

Pour un nombre impair, l'expression renverra '1' comme reste, donnant

messages.get (1) = 'impair' et donc imprimer 'impair'

sinon, 'even' est affiché lorsque l'expression donne le résultat '0'

Aseem Yadav
la source
1
Cette question a été identifiée comme JAVA. Vous avez publié une réponse en Python. Pas vraiment utile.
Mark
Salut @Mark! Merci d'avoir souligné cela, édité la réponse. J'espère que cela peut encore être utile à quelqu'un cette fois.
Aseem Yadav du
1
Il peut être facilement écrasé par exemple par: int n = -3;. Comme @Camilo mentionné ci-dessous - lorsque l'opération de reste retourne un résultat différent de zéro, elle a le même signe que son opérande de gauche si généreusement nous avons System.out.println(messages.get(-1));ce qui nous donnejava.lang.ArrayIndexOutOfBoundsException
Michu93
1

Si le module du nombre donné est égal à zéro, le nombre est pair ou impair. Voici la méthode qui fait cela:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }
Cornéliouz Bett
la source
0
package isevenodd;
import java.util.Scanner;
public class IsEvenOdd {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter number: ");
        int y = scan.nextInt();       
        boolean isEven = (y % 2 == 0) ? true : false;
        String x = (isEven) ? "even" : "odd";  
        System.out.println("Your number is " + x);
    }
}
Bob
la source
Quel est le but de '?' sign
Rana Talha Tariq
0

Voici un exemple pour déterminer si un nombre donné est pair ou impair,

import java.util.Scanner;

public class EvenOdd
{
   public static void main(String[] args)
   {
      int a;
      System.out.println("Please enter a number to check even or odd:");
      Scanner sc = new Scanner(System.in);
      a = sc.nextInt();

      if(a % 2 == 0)
      {
         System.out.println("Entered number is an even number");
      }
      else
      {
         System.out.println("Entered number is an odd number");
      }
   }
}

Eh bien, il existe de nombreuses façons de déterminer la même chose. Référez - vous à cette ressource pour plus d'exemples pour trouver que le nombre donné est pair ou impair.

Shiva
la source
0

Voici un exemple complet: -

import java.text.ParseException;

public class TestOddEvenExample {
    public static void main(String args[]) throws ParseException {

        int x = 24;
        oddEvenChecker(x);

        int xx = 3;
        oddEvenChecker(xx);
    }

    static void oddEvenChecker(int x) {
        if (x % 2 == 0)
            System.out.println("You entered an even number." + x);
        else
            System.out.println("You entered an odd number." + x);
    }
}

entrez la description de l'image ici

Vipul Gulhane
la source