Verifique se o número é par ou ímpar

128

Como eu determinaria se um determinado número é par ou ímpar? Estou querendo descobrir isso há muito tempo e não cheguei a lugar nenhum.

Josh
fonte

Respostas:

200

Você pode usar o operador de módulo, mas isso pode ser lento. Se for um número inteiro, você pode fazer:

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

Isso ocorre porque o bit baixo será sempre definido em um número ímpar.

lucasmo
fonte
23
Ainda me surpreende que as pessoas prefiram o módulo do que simplesmente verificar o primeiro bit do número. Obviamente, se o primeiro bit estiver definido, o número deverá ser ímpar. Geralmente é mais rápido, e lê-se tão bem na minha opinião. Eu acho que a razão pela qual os outros não o preferem ao módulo se resume à falta de entendimento do binário.
esmagar
5
@ Dtech Eu acho que você não entende o significado da otimização prematura. Se você sabe de antemão que um método é mais eficiente que outro, não é uma otimização prematura usar o método mais eficiente. É inteligente. Dito isto, meu comentário foi mais sobre como verificar o primeiro bit é mais lógico do que usar o módulo ao simplesmente verificar se é par / ímpar. O problema é que muitos programadores não entendem o que qualquer um dos métodos faz e apenas seguem os tutoriais.
esmague
54
@crush n % 2 == 0significa semanticamente Divide by 2 and check if the remainder is 0, o que é muito mais claro do n & 1 == 0que isso significa Zero all the bits but leave the least significant bit unchanged and check if the result is 0. A clareza aprimorada do primeiro vale a sobrecarga (provavelmente inexistente). Isso foi o que eu quis dizer com otimização prematura. Se algo é lento e você o perfila nessa parte, mudar n % 2para n & 1certamente é justificado, mas fazê-lo antecipadamente não é. Em geral, trabalhar com os operadores de bit é uma má ideia antes de criar um perfil.
Dtech 5/05
18
@dtech Antes de tudo, sua opinião é completamente subjetiva. Segundo, você ainda não entende o que significa "otimização prematura". É uma micro otimização, com certeza. Não é uma otimização prematura. A otimização prematura está revisando o código existente com "otimizações" sem primeiro criar um perfil do código existente para verificar se ele é ineficiente. No entanto, saber de antemão que escrever código de uma maneira ou de outra maneira é mais eficiente e optar por usar o código mais eficiente NÃO é uma otimização prematura. É sua opinião subjetiva que n % 2 == 0é mais limpa do que n & 1 == 0.
esmagar
15
Gostaria apenas de destacar para as pessoas que estão aqui que usar o operador modulo é bom, mas se você estiver usando para testar a estranheza, escreva n% 2! = 0, não n% 2 == 1, porque o último não funciona para números negativos em Java.
Jxek
98
if((x%2)==0)
   // even
else
   // odd
poy
fonte
30

Se o restante quando você divide por 2 for 0, é par. %é o operador para obter um restante.

Ryan Stewart
fonte
12
O operador% é chamado módulo.
Anthony
4
@ Anthony: Na verdade, é o "operador restante" .
Ryan Stewart
3
O termo matemático é módulo e tem aplicabilidade mais ampla do que o restante. (A % B)ela mesma pode ser usada como expressão, e é aí que as coisas ficam divertidas.
Stefan Kendall
2
@Stefan: Eu não vou enfatizar o ponto, mas os matemáticos tendem a apontar que na aritmética modular o módulo e o restante não são a mesma coisa .
Ryan Stewart
2
@StefanKendall Verifique a especificação da linguagem Java # 15.17.3 . O Google não é uma referência normativa.
Marquês de Lorne #
24

O operador restante,%, fornecerá o restante após a divisão por um número.

Então n % 2 == 0será verdade se n for par e false se n for ímpar.

Phil
fonte
21

Todo número par é divisível por dois, independentemente de ser um decimal (mas o decimal, se presente, também deve ser par). Então você pode usar o% operador (módulo), que divide o número à esquerda pelo número à direita e retorna o restante ...

boolean isEven(double num) { return ((num % 2) == 0); }
fireshadow52
fonte
1
'Independentemente de ser um decimal' não faz sentido. Decimal é uma raiz. Você quer dizer 'contém uma parte fracionária'?
Marquês de Lorne #
4

eu recomendaria

Java Puzzlers: Armadilhas, Armadilhas e Caixas de Canto Livro de Joshua Bloch e Neal Gafter

Há uma breve explicação de como verificar se o número é ímpar. A primeira tentativa é algo semelhante ao que o @AseemYadav tentou:

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

mas como foi mencionado no livro:

quando a operação restante retorna um resultado diferente de zero, ela tem o mesmo sinal que seu operando esquerdo

geralmente quando temos um número ímpar negativo, em vez de 1obter -1o resultado i%2. Para que possamos usar a solução @Camilo ou simplesmente:

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

mas geralmente a solução mais rápida é usar o operador AND como o @lucasmo write acima:

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

@Edit Também vale a pena apontar Math.floorMod(int x, int y);que lida bem com o dividendo negativo, mas também pode retornar -1se o divisor for negativo

Michu93
fonte
2

Funciona para números positivos ou 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
fonte
2

O bit menos significativo (mais à direita) pode ser usado para verificar se o número é par ou ímpar. Para todos os números ímpares, o bit mais à direita é sempre 1 na representação binária.

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

fonte
2

O programa a seguir pode lidar com números grandes (número de dígitos maior 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");

    }
}

Aqui está a saída ::

  122873215981652362153862153872138721637272
  Even
Titus Roby K
fonte
1

Você pode usar o operador de módulo, mas isso pode ser lento. Uma maneira mais eficiente seria verificar o bit mais baixo, porque isso determina se um número é par ou ímpar. O código ficaria assim:

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

Você pode fazer assim:

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

Isso ocorre porque o Java possui em seu módulo de operação o sinal do dividendo, no lado esquerdo: n. Portanto, para dividendos negativos e positivos, o módulo tem o sinal deles.

Obviamente, a operação bit a bit é mais rápida e otimizada, basta documentar a linha de código com duas ou três palavras curtas, o que facilita a leitura.

Camilo
fonte
É chamado de operador restante , não o operador de módulo.
Marquês de Lorne
1

Outra maneira fácil de fazer isso sem usar a condição if / else (funciona para números positivos e negativos):

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

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

Para um número ímpar, a expressão retornará '1' como restante, fornecendo

messages.get (1) = 'ímpar' e, portanto, imprimindo 'ímpar'

caso contrário, 'even' será impresso quando a expressão aparecer com o resultado '0'

Aseem Yadav
fonte
1
Esta pergunta foi marcada como JAVA. Você postou uma resposta em Python. Não é realmente útil.
Mark
Hey @Mark! Obrigado por apontar isso, editou a resposta. Espero que ainda possa ajudar alguém neste momento.
Aseem Yadav
1
Ele pode ser facilmente bateu por exemplo: int n = -3;. Como @Camilo mencionados abaixo - quando a operação restante retornar um resultado diferente de zero, ele tem o mesmo sinal como seu operando esquerdo para generelly temos System.out.println(messages.get(-1));que nos dájava.lang.ArrayIndexOutOfBoundsException
Michu93
1

Se o módulo do número fornecido for igual a zero, o número será ainda mais ímpar. Abaixo está o método que faz isso:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }
corneliouz Bett
fonte
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);
    }
}
Prumo
fonte
Qual é o propósito de '?' sinal
Rana Talha Tariq
0

Aqui está um exemplo para determinar se um determinado número é par ou ímpar,

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

Bem, existem muitas maneiras de determinar o mesmo. Consulte este recurso para obter mais exemplos para descobrir que o número fornecido é par ou ímpar.

Shiva
fonte
0

Aqui está um exemplo 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);
    }
}

insira a descrição da imagem aqui

Vipul Gulhane
fonte