Sprawdź, czy liczba jest parzysta czy nieparzysta


133

Jak określić, czy dana liczba jest parzysta czy nieparzysta? Od dawna chciałem to rozgryźć i do niczego nie doszedłem.

Odpowiedzi:


205

Możesz użyć operatora modułu, ale może to być powolne. Jeśli jest to liczba całkowita, możesz:

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

Dzieje się tak, ponieważ niski bit będzie zawsze ustawiany na nieparzystą liczbę.


23
Wciąż zadziwia mnie, że ludzie wolą moduł od zwykłego sprawdzania pierwszego bitu liczby. Oczywiście, jeśli ustawiony jest pierwszy bit, liczba musi być nieparzysta. Zwykle jest szybszy i moim zdaniem czyta równie dobrze. Myślę, że powodem, dla którego inni nie wolą tego od modułu, jest brak zrozumienia binarności.
zmiażdżyć

5
@dtech Myślę, że źle rozumiesz znaczenie przedwczesnej optymalizacji. Jeśli wiesz z góry, że jedna metoda jest bardziej wydajna niż inna, to nie jest przedwczesna optymalizacja, aby użyć bardziej wydajnej metody. Jest inteligentny. To powiedziawszy, mój komentarz dotyczył bardziej tego, jak sprawdzanie pierwszego bitu jest bardziej logiczne niż używanie modułu podczas prostego sprawdzania parzystych / nieparzystych. Problem polega na tym, że wielu programistów nie rozumie, co robi każda z metod i po prostu postępuje zgodnie z samouczkami.
zmiażdżyć

54
@crush n % 2 == 0oznacza semantycznie Divide by 2 and check if the remainder is 0, co jest znacznie jaśniejsze niż n & 1 == 0to, co oznacza Zero all the bits but leave the least significant bit unchanged and check if the result is 0. Poprawiona przejrzystość pierwszego jest warta (prawdopodobnie nieistniejącego) narzutu. To właśnie miałem na myśli mówiąc o przedwczesnej optymalizacji. Jeśli coś jest powolne i profilujesz to w tej części, zmiana n % 2na n & 1jest z pewnością uzasadniona, ale zrobienie tego wcześniej nie jest. Ogólnie rzecz biorąc, praca z operatorami bitów przed profilowaniem jest złym pomysłem.
dtech

18
@dtech Przede wszystkim Twoja opinia jest całkowicie subiektywna. Po drugie, nadal nie rozumiesz, co oznacza „przedwczesna optymalizacja”. Oczywiście jest to mikro optymalizacja. To nie jest przedwczesna optymalizacja. Przedwczesna optymalizacja to rewizja istniejącego kodu za pomocą „optymalizacji” bez uprzedniego profilowania istniejącego kodu, aby zobaczyć, że jest nieefektywny. Jednak wiedza z góry, że pisanie kodu w jedną, a drugą stronę jest bardziej wydajne, i wybranie bardziej wydajnego kodu NIE jest przedwczesną optymalizacją. To twoja subiektywna opinia n % 2 == 0jest czystsza niż n & 1 == 0.
zmiażdżyć

15
Chciałbym tylko zwrócić uwagę osobom przyjeżdżającym tutaj, że użycie operatora modulo jest w porządku, ale jeśli używasz go do testowania dziwności, napisz n% 2! = 0, a nie n% 2 == 1, ponieważ to drugie nie działa dla liczb ujemnych w Javie.
Jxek


30

Jeśli reszta po podzieleniu przez 2 wynosi 0, jest parzysta. %jest operatorem, który ma otrzymać resztę.


12
Operator% nazywa się modulo.
Anthony,

4
@Anthony: Właściwie to jest to „operator reszty” .
Ryan Stewart

3
Termin matematyczny to moduł i ma szersze zastosowanie niż uzyskanie reszty. (A % B)można użyć jako wyrażenia i wtedy robi się fajnie.
Stefan Kendall,

2
@Stefan: Nie będę się nad tym rozwodzić, ale matematycy mają tendencję do wskazywania, że ​​w arytmetyce modularnej moduł i reszta nie są tym samym .
Ryan Stewart

2
@StefanKendall Sprawdź specyfikację języka Java # 15.17.3 . Google nie jest odniesieniem normatywnym.
Markiz Lorne

24

Operator reszty,%, poda resztę po podzieleniu przez liczbę.

Więc n % 2 == 0będzie prawdą, jeśli n jest parzyste, a fałszem, jeśli n jest nieparzyste.


22

Każda liczba parzysta jest podzielna przez dwa, niezależnie od tego, czy jest to liczba dziesiętna (ale liczba dziesiętna, jeśli występuje, również musi być parzysta). Możesz więc użyć %operatora (modulo), który dzieli liczbę po lewej stronie przez liczbę po prawej i zwraca resztę ...

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

1
„Niezależnie od tego, czy jest to ułamek dziesiętny” nie ma sensu. Liczba dziesiętna to podstawa. Czy masz na myśli „zawiera część ułamkową”?
Markiz Lorne

4

Chciałbym polecić

Java Puzzlers: Traps, Pitfalls, and Corner Cases Book autorstwa Joshua Blocha i Neala Gaftera

Istnieje krótkie wyjaśnienie, jak sprawdzić, czy liczba jest nieparzysta. Pierwsza próba to coś podobnego do tego, co próbował @AseemYadav:

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

ale jak wspomniano w książce:

gdy operacja reszty zwraca wynik różny od zera, ma ten sam znak co lewy operand

więc ogólnie, gdy mamy ujemną liczbę nieparzystą, zamiast tego 1otrzymamy -1jako wynik i%2. Możemy więc skorzystać z rozwiązania @Camilo lub po prostu:

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

ale generalnie najszybszym rozwiązaniem jest użycie operatora AND, takiego jak @lucasmo, napisz powyżej:

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

@Edit Warto również wskazać, Math.floorMod(int x, int y);który radzi sobie dobrze z ujemną dywidendą, ale może również zwrócić, -1jeśli dzielnik jest ujemny


2

Działa dla liczb dodatnich lub ujemnych

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

Najmniej znaczący bit (prawy) może być użyty do sprawdzenia, czy liczba jest parzysta czy nieparzysta. Dla wszystkich liczb nieparzystych, najbardziej prawy bit ma zawsze 1 w reprezentacji binarnej.

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

2

Jeśli moduł podanej liczby jest równy zero, jest to liczba parzysta, w przeciwnym razie liczba nieparzysta. Poniżej znajduje się metoda, która to robi:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }

2

Ten następujący program może obsługiwać duże liczby (liczba cyfr większa niż 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");

    }
}

Oto wynik:

  122873215981652362153862153872138721637272
  Even

1

Możesz użyć operatora modułu, ale może to być powolne. Bardziej wydajnym sposobem byłoby sprawdzenie najniższego bitu, ponieważ to określa, czy liczba jest parzysta czy nieparzysta. Kod wyglądałby mniej więcej tak:

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

Możesz zrobić tak:

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

Dzieje się tak, ponieważ Java w swojej operacji modulo ma znak dywidendy, po lewej stronie: n. Tak więc w przypadku dywidend negatywnych i pozytywnych modulo ma ich znak.

Oczywiście operacja bitowa jest szybsza i zoptymalizowana, wystarczy udokumentować wiersz kodu za pomocą dwóch lub trzech krótkich słów, co zwiększa czytelność.


Nazywa się to operatorem reszty , a nie operatorem modulo.
Markiz Lorne

1

Inny łatwy sposób na zrobienie tego bez użycia warunku if / else (działa zarówno dla liczb dodatnich, jak i ujemnych):

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

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

Dla Nieparzystego nie. Wyrażenie zwróci „1” jako resztę, dając

messages.get (1) = 'nieparzyste' i dlatego wypisuje 'nieparzyste'

w przeciwnym razie wypisywane jest „parzyste”, gdy wyrażenie zwraca wynik „0”


1
To pytanie zostało oznaczone jako JAVA. Opublikowałeś odpowiedź w Pythonie. Niezbyt przydatne.
Mark

Hej @Mark! Dzięki za zwrócenie uwagi, zredagowałem odpowiedź. Mam nadzieję, że tym razem nadal może komuś pomóc.
Aseem Yadav

1
Może być łatwo rozbił na przykład: int n = -3;. Jak wspomniano poniżej @Camilo - kiedy reszta operacji zwraca wynik niezerowy, ma ten sam znak co lewy operand, więc ogólnie mamy to, System.out.println(messages.get(-1));co nam dajejava.lang.ArrayIndexOutOfBoundsException
Michu93

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

Jaki jest cel znaku „?” znak
Rana Talha Tariq

0

Oto przykład, aby określić, czy dana liczba jest parzysta czy nieparzysta,

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

Cóż, istnieje wiele sposobów, aby ustalić to samo. Zapoznaj się z tym źródłem, aby uzyskać więcej przykładów, aby znaleźć podaną liczbę parzystą lub nieparzystą.


0

Oto pełny przykład: -

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

wprowadź opis obrazu tutaj


0
    /**
     * Check if a number is even or not using modulus operator.
     *
     * @param number the number to be checked.
     * @return {@code true} if the given number is even, otherwise {@code false}.
     */
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }

    /**
     * Check if a number is even or not using & operator.
     *
     * @param number the number to be checked.
     * @return {@code true} if the given number is even, otherwise {@code false}.
     */
    public static boolean isEvenFaster(int number) {
        return (number & 1) == 0;
    }

źródło

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.