Перевірте, чи число парне чи непарне


128

Як я можу визначити, чи задане число парне чи непарне? Я давно хотів розібратися в цьому і ніде не дістався.

Відповіді:


200

Можна використовувати оператор модуля, але це може бути повільним. Якщо це ціле число, ви можете:

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

Це тому, що низький біт завжди буде встановлюватися на непарне число.


23
Мене все ще дивує, що люди віддають перевагу модулю над простою перевіркою першого біта числа. Очевидно, якщо встановлено перший біт, то число повинно бути непарним. Зазвичай це швидше, і він читається так само добре, на мій погляд. Я думаю, що причина, чому інші не віддають перевагу над модулем, зводиться до нерозуміння бінарного.
розчавити

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

18
@dtech Перш за все, ваша думка є абсолютно суб'єктивною. По-друге, ви все ще не розумієте, що означає "передчасна оптимізація". Це, безумовно, мікрооптимізація. Це не передчасна оптимізація. Передчасна оптимізація - це перегляд існуючого коду з "оптимізаціями", не попередньо профайлюючи існуючий код, щоб побачити, що він неефективний. Однак, знаючи заздалегідь, що написання коду одним способом проти іншого способу є більш ефективним, а вибір використання більш ефективного коду НЕ передчасна оптимізація. Це ваша суб'єктивна думка , що n % 2 == 0це чистіше , ніж n & 1 == 0.
розчавити

15
Я хотів би лише зазначити людям, які приїжджають сюди, що використання оператора модуля нормально, але якщо ви використовуєте його для перевірки дивацтва, напишіть n% 2! = 0, а не n% 2 == 1, тому що останній не працює для негативних чисел на Java.
Jxek


30

Якщо залишок при діленні на 2 дорівнює 0, це рівномірне. %- оператор, щоб отримати залишок.


12
Оператор% називається модулем.
Ентоні

4
@Anthony: Насправді, це "оператор залишку" .
Райан Стюарт

3
Математичний термін є модулем, і він має більш широке застосування, ніж отримання решти. (A % B)сам по собі може бути використаний як вираз, і саме тоді справи отримують задоволення.
Стефан Кендалл

2
@Stefan: Я не буду ставити під сумнів суть, але математики, як правило, зазначають, що в модульній арифметиці модуль і решта - це не те саме .
Райан Стюарт

2
@StefanKendall Перевірте специфікацію мови Java №15.17.3 . Google не є нормативним посиланням.
Маркіз Лорн

24

Оператор, що залишився,%, видасть вам залишок після ділення на число.

Так n % 2 == 0буде вірно, якщо n парне і хибне, якщо n непарне.


21

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

boolean isEven(double num) { return ((num % 2) == 0); }

1
"Незалежно від того, чи є десяткова", безглуздо. Десяткові - це радіус. Ви маєте на увазі "містить дробову частину"?
Маркіз Лорн

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

але в цілому найшвидшим рішенням є використання оператора AND, як-от @lucasmo, пишіть вище:

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

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


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

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. Тож щодо негативів та позитивних дивідендів модуль має їх знак.

Звичайно, бітова операція швидша та оптимізована, просто документуйте рядок коду двома-трьома короткими словами, що робить це для читабельності.


Його називають оператором залишку , а не оператором модуля.
Маркіз Лорн

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) = 'непарний' і, отже, друк 'непарний'

інше, "even" друкується, коли вираз з’являється з результатом "0"


1
Це питання було позначено як JAVA. Відповідь ви опублікували в Python. Не дуже корисно насправді.
Марк

Гей @ Марк! Дякуємо, що вказали на це, відредагували відповідь. Сподіваюся, цього разу комусь це може допомогти.
Асеем Ядав

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.