Проверить, четное или нечетное число

131

Как мне определить, четное или нечетное число? Я давно хотел разобраться в этом и ничего не добился.

мистифицировать
источник

Ответы:

202

Вы можете использовать оператор модуля, но это может быть медленным. Если это целое число, вы можете:

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

Это потому, что младший бит всегда будет установлен на нечетное число.

lucasmo
источник
23
Меня до сих пор удивляет, что люди предпочитают модуль простой проверке первого бита числа. Очевидно, что если установлен первый бит, то число должно быть нечетным. Обычно он быстрее и, на мой взгляд, не хуже читается. Я думаю, что причина, по которой другие не предпочитают его модулю, заключается в недостаточном понимании двоичного кода.
Crush
5
@dtech Я думаю, вы неправильно понимаете значение преждевременной оптимизации. Если вы заранее знаете, что один метод более производительный, чем другой, то это не преждевременная оптимизация для использования более производительного метода. Это умно. Тем не менее, мой комментарий был больше о том, что проверка первого бита более логична, чем использование модуля при простой проверке на четность / нечетность. Проблема в том, что многие программисты не понимают, что делает тот или иной метод, и просто следуют инструкциям.
раздавить
54
@crush n % 2 == 0семантически означает Divide by 2 and check if the remainder is 0, что гораздо яснее, чем то, n & 1 == 0что означает Zero all the bits but leave the least significant bit unchanged and check if the result is 0. Улучшенная ясность первого стоит накладных расходов (возможно, несуществующих). Это то, что я имел в виду под преждевременной оптимизацией. Если что-то идет медленно и вы профилируете это в этой части, переход n % 2на n & 1, безусловно, оправдан, но делать это заранее - нет. В общем, работа с битовыми операторами перед профилированием - плохая идея.
dtech 05
18
@dtech Во-первых, ваше мнение полностью субъективно. Во-вторых, вы до сих пор не понимаете, что такое «преждевременная оптимизация». Конечно, это микро-оптимизация. Это не преждевременная оптимизация. Преждевременная оптимизация - это пересмотр существующего кода с «оптимизацией» без предварительного профилирования существующего кода, чтобы убедиться в его неэффективности. Однако заранее знать, что написание кода одним способом по сравнению с другим более эффективно, и выбор использования более эффективного кода НЕ является преждевременной оптимизацией. Это ваше субъективное мнение , что n % 2 == 0это чище , чем n & 1 == 0.
раздавить
15
Я просто хотел бы указать для людей, приходящих сюда, что использование оператора по модулю - это нормально, но если вы используете его для проверки странности, напишите n% 2! = 0, а не n% 2 == 1, потому что последний не работает для отрицательных чисел в Java.
Jxek 08
30

Если остаток от деления на 2 равен 0, он четный. %оператор для получения остатка.

Райан Стюарт
источник
12
Оператор% называется по модулю.
Энтони
4
@Anthony: Фактически, это «оператор остатка» .
Райан Стюарт
3
Математический термин - модуль, и он имеет более широкое применение, чем получение остатка. (A % B)сам по себе может использоваться как выражение, и тогда все становится весело.
Стефан Кендалл
2
@Stefan: Я не буду вдаваться в подробности, но математики склонны указывать на то, что в модульной арифметике модуль и остаток - не одно и то же .
Райан Стюарт
2
@StefanKendall Проверьте спецификацию языка Java № 15.17.3 . Google не является нормативным справочником.
Marquis of Lorne
24

Оператор остатка% выдаст вам остаток после деления на число.

Так n % 2 == 0 будет истинно, если n четно, и ложно, если n нечетно.

Фил
источник
21

Каждое четное число делится на два, независимо от того, является ли оно десятичным (но десятичное число, если оно присутствует, также должно быть четным). Таким образом, вы можете использовать %оператор (по модулю), который делит число слева на число справа и возвращает остаток ...

boolean isEven(double num) { return ((num % 2) == 0); }
fireshadow52
источник
1
«Независимо от того, десятичное ли это» - бессмысленно. Десятичная дробь - это система счисления. Вы имеете в виду "содержит дробную часть"?
Marquis of Lorne
4

я бы порекомендовал

Книга Джошуа Блоха и Нила Гафтера "Пазлы Java: ловушки, подводные камни и угловые случаи"

Вот краткое объяснение того, как проверить, нечетное ли число. Первая попытка похожа на то, что пытался @AseemYadav:

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

но как было упомянуто в книге:

когда операция остатка возвращает ненулевой результат, он имеет тот же знак, что и его левый операнд

поэтому обычно, когда у нас есть отрицательное нечетное число, вместо этого 1мы получаем -1в результате i%2. Итак, мы можем использовать решение @Camilo или просто:

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

но обычно самым быстрым решением является использование оператора И, например @lucasmo, написанного выше:

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

@Edit Также стоит указать, Math.floorMod(int x, int y);что хорошо работает с отрицательным дивидендом, но также может возвращаться, -1если делитель отрицательный

Michu93
источник
2

Работает для положительных или отрицательных чисел

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
источник
2

Наименьший значащий бит (крайний правый) можно использовать для проверки четности или нечетности числа. Для всех нечетных чисел крайний правый бит всегда равен 1 в двоичном представлении.

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

источник
2

Эта следующая программа может обрабатывать большие числа (количество цифр больше 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");

    }
}

Вот результат:

  122873215981652362153862153872138721637272
  Even
Титус Роби К
источник
1

Вы можете использовать оператор модуля, но это может быть медленным. Более эффективным способом было бы проверить младший бит, потому что он определяет, четное или нечетное число. Код будет выглядеть примерно так:

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"));        
}
Пощечина Чукандару Сингху
источник
1

Сделать можно так:

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

Это потому, что Java в своей операции по модулю имеет знак делимого, левая часть: n. Таким образом, для отрицательных и положительных дивидендов модуль имеет их знак.

Конечно, побитовые операции выполняются быстрее и оптимизированы, просто задокументируйте строку кода двумя или тремя короткими словами для удобства чтения.

Камило
источник
Он называется оператором остатка , а не оператором по модулю.
Marquis of Lorne
1

Еще один простой способ сделать это без использования условия if / else (работает как для положительных, так и для отрицательных чисел):

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

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

Для нечетного числа выражение вернет '1' в качестве остатка, давая

messages.get (1) = 'odd' и, следовательно, вывод 'odd'

иначе, 'даже' печатается, когда выражение приходит с результатом '0'

Асим Ядав
источник
1
Этот вопрос был помечен как JAVA. Вы отправили ответ на Python. На самом деле не так уж и полезно.
Марк
Привет @Mark! Спасибо, что указали на это, отредактировал ответ. Надеюсь, на этот раз он все еще может кому-то помочь.
Aseem Yadav
1
Это может быть легко разбился, например,: int n = -3;. Как упомянул @Camilo ниже - когда операция с остатком возвращает ненулевой результат, он имеет тот же знак, что и его левый операнд, поэтому, в общем, у нас есть System.out.println(messages.get(-1));то , что дает намjava.lang.ArrayIndexOutOfBoundsException
Michu93
1

Если модуль данного числа равен нулю, число является четным, иначе нечетным числом. Ниже приведен способ, позволяющий это сделать:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }
Corneliouz Bett
источник
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);
    }
}
боб
источник
Какова цель "?" вывеска
Рана Тальха Тарик
0

Вот пример, чтобы определить, является ли данное число четным или нечетным,

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

Что ж, есть много способов определить то же самое. Обратитесь к этому ресурсу для получения дополнительных примеров, чтобы узнать, является ли данное число четным или нечетным.

Шива
источник
0

Вот полный пример: -

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

введите описание изображения здесь

Випул Гюльхане
источник