Compruebe si el número es par o impar

128

¿Cómo determinaría si un número dado es par o impar? Llevo mucho tiempo queriendo resolver esto y no he llegado a ningún lado.

Josh
fuente

Respuestas:

201

Puede usar el operador de módulo, pero eso puede ser lento. Si es un número entero, puede hacer:

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

Esto se debe a que el bit bajo siempre se establecerá en un número impar.

lucasmo
fuente
23
Todavía me sorprende que la gente prefiera el módulo en lugar de simplemente verificar el primer bit del número. Obviamente, si se establece el primer bit, entonces el número debe ser impar. Por lo general, es más rápido y, en mi opinión, se lee igual de bien. Creo que la razón por la que otros no lo prefieren sobre el módulo se debe a la falta de comprensión del binario.
aplastar
55
@dtech Creo que no entiendes el significado de la optimización prematura. Si sabe de antemano que un método es más eficaz que otro, entonces no es una optimización prematura utilizar el método más eficaz. Es inteligente Dicho esto, mi comentario fue más acerca de cómo verificar el primer bit es más lógico que usar el módulo cuando simplemente verifica si es par / impar. El problema es que muchos programadores no entienden lo que hace cualquiera de los métodos y solo siguen los tutoriales.
enamorado
54
@crush n % 2 == 0significa semánticamente Divide by 2 and check if the remainder is 0, lo que es mucho más claro de lo n & 1 == 0que significa Zero all the bits but leave the least significant bit unchanged and check if the result is 0. La claridad mejorada de la primera vale la sobrecarga (probablemente no existente). Eso es lo que quise decir con optimización prematura. Si algo es lento y que el perfil it en esa parte cambiando n % 2a n & 1es, sin duda justificada, pero hacerlo de antemano que no es. En general, trabajar con los operadores de bits es una mala idea antes de crear un perfil.
dtech
18
@dtech En primer lugar, su opinión es completamente subjetiva. En segundo lugar, todavía no comprende lo que significa "optimización prematura". Es una micro optimización, seguro. No es una optimización prematura. La optimización prematura es revisar el código existente con "optimizaciones" sin primero perfilar el código existente para ver que es ineficiente. Sin embargo, saber de antemano que escribir código de una manera frente a otra es más eficiente, y elegir usar el código más eficiente NO es una optimización prematura. Es tu opinión subjetiva la que n % 2 == 0está más limpia que n & 1 == 0.
enamorado
15
Me gustaría señalar a las personas que vienen aquí que usar el operador de módulo está bien, pero si lo está usando para probar la rareza, escriba n% 2! = 0, no n% 2 == 1, porque este último no funciona para números negativos en Java.
Jxek
98
if((x%2)==0)
   // even
else
   // odd
poy
fuente
30

Si el resto cuando divide por 2 es 0, es par. %es el operador para obtener el resto.

Ryan Stewart
fuente
12
El operador% se llama módulo.
Anthony
44
@Anthony: En realidad, es el "operador restante" .
Ryan Stewart
3
El término matemático es módulo, y tiene una aplicabilidad más amplia que obtener el resto. (A % B)en sí mismo puede usarse como una expresión, y ahí es cuando las cosas se ponen divertidas.
Stefan Kendall
2
@Stefan: No voy a expresar el punto, pero los matemáticos tienden a señalar que en la aritmética modular el módulo y el resto no son lo mismo .
Ryan Stewart
2
@StefanKendall Verifique la Especificación del lenguaje Java # 15.17.3 . Google no es una referencia normativa.
Marqués de Lorne
24

El operador restante,%, le dará el resto después de dividirlo por un número.

Entonces n % 2 == 0será verdadero si n es par y falso si n es impar.

Phil
fuente
21

Cada número par es divisible por dos, independientemente de si es un decimal (pero el decimal, si está presente, también debe ser par). Entonces puede usar el %operador (módulo), que divide el número de la izquierda por el número de la derecha y devuelve el resto ...

boolean isEven(double num) { return ((num % 2) == 0); }
sombra de fuego52
fuente
1
'Independientemente de si es un decimal' no tiene sentido. Decimal es una raíz. ¿Quieres decir 'contiene una parte fraccional'?
Marqués de Lorne
4

yo recomendaria

Java Puzzlers: Libro de trampas, trampas y casos de esquina por Joshua Bloch y Neal Gafter

Hay una breve explicación de cómo verificar si el número es impar. El primer intento es algo similar a lo que intentó @AseemYadav:

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

pero como se mencionó en el libro:

cuando la operación restante devuelve un resultado distinto de cero, tiene el mismo signo que su operando izquierdo

así que generalmente cuando tenemos un número impar negativo, en lugar de 1obtenerlo -1como resultado de i%2. Entonces podemos usar la solución @Camilo o simplemente hacer:

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

pero generalmente la solución más rápida es usar el operador AND como @lucasmo escribe arriba:

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

@Editar También vale la pena señalar Math.floorMod(int x, int y);cuál es bueno con el dividendo negativo, pero también puede regresar -1si el divisor es negativo

Michu93
fuente
2

Funciona para números positivos o negativos.

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
fuente
2

El bit menos significativo (más a la derecha) se puede utilizar para verificar si el número es par o impar. Para todos los números impares, el bit más a la derecha es siempre 1 en representación binaria.

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

fuente
2

El siguiente programa puede manejar grandes números (número de dígitos mayor que 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");

    }
}

Aquí está la salida ::

  122873215981652362153862153872138721637272
  Even
Titus Roby K
fuente
1

Puede usar el operador de módulo, pero eso puede ser lento. Una forma más eficiente sería verificar el bit más bajo porque eso determina si un número es par o impar. El código se vería así:

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
fuente
1

Puedes hacer así:

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

Esto se debe a que Java tiene en su módulo de operación el signo del dividendo, el lado izquierdo: n. Entonces, para dividendos negativos y positivos, el módulo tiene el signo de ellos.

Por supuesto, la operación bit a bit es más rápida y optimizada, simplemente documente la línea de código con dos o tres palabras cortas, lo que lo hace para facilitar la lectura.

Camilo
fuente
Se llama operador restante , no operador de módulo.
Marqués de Lorne
1

Otra forma fácil de hacerlo sin usar la condición if / else (funciona tanto para números positivos como negativos):

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

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

Para un número impar, la expresión devolverá '1' como resto, dando

messages.get (1) = 'impar' y, por lo tanto, imprime 'impar'

de lo contrario, 'even' se imprime cuando la expresión aparece con el resultado '0'

Aseem Yadav
fuente
1
Esta pregunta fue etiquetada como JAVA. Publicaste una respuesta en Python. No es tan útil realmente.
Mark
¡Hola @ Mark! Gracias por señalar eso, editó la respuesta. Espero que esta vez pueda ser de alguna ayuda para alguien.
Aseem Yadav
1
Que pueden ser derribados fácilmente por ejemplo: int n = -3;. Como @Camilo menciona a continuación: cuando la operación restante devuelve un resultado distinto de cero, tiene el mismo signo que su operando izquierdo, tan generosamente tenemos System.out.println(messages.get(-1));lo que nos dajava.lang.ArrayIndexOutOfBoundsException
Michu93
1

Si el módulo del número dado es igual a cero, el número es incluso un número impar. A continuación se muestra el método que hace eso:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }
corneliouz Bett
fuente
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);
    }
}
Beto
fuente
Cual es el proposito de '?' signo
Rana Talha Tariq
0

Aquí hay un ejemplo para determinar si un número dado es par o impar,

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");
      }
   }
}

Bueno, hay muchas formas de determinar lo mismo. Consulte este recurso para obtener más ejemplos para encontrar que el número dado es par o impar.

Shiva
fuente
0

Aquí hay un ejemplo completo: -

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);
    }
}

ingrese la descripción de la imagen aquí

Vipul Gulhane
fuente