Überprüfen Sie, ob die Zahl gerade oder ungerade ist

128

Wie würde ich feststellen, ob eine bestimmte Zahl gerade oder ungerade ist? Ich wollte das schon lange herausfinden und bin nirgendwo hingekommen.

Josh
quelle

Antworten:

200

Sie können den Moduloperator verwenden, dies kann jedoch langsam sein. Wenn es sich um eine Ganzzahl handelt, können Sie Folgendes tun:

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

Dies liegt daran, dass das niedrige Bit immer auf eine ungerade Zahl gesetzt wird.

lucasmo
quelle
23
Es wundert mich immer noch, dass die Leute den Modul dem einfachen Überprüfen des ersten Bits der Zahl vorziehen. Wenn das erste Bit gesetzt ist, muss die Zahl natürlich ungerade sein. Es ist normalerweise schneller und liest sich meiner Meinung nach genauso gut. Ich denke, der Grund, warum andere es dem Modul nicht vorziehen, liegt in einem mangelnden Verständnis der Binärdatei.
Crush
5
@dtech Ich denke, Sie verstehen die Bedeutung vorzeitiger Optimierung falsch. Wenn Sie im Voraus wissen, dass eine Methode leistungsfähiger ist als eine andere, ist es keine vorzeitige Optimierung, die leistungsfähigere Methode zu verwenden. Es ist intelligent. In meinem Kommentar ging es jedoch mehr darum, wie das Überprüfen des ersten Bits logischer ist als das Verwenden des Moduls, wenn einfach nach Geraden / Ungeraden gesucht wird. Das Problem ist, dass viele Programmierer nicht verstehen, was beide Methoden tun, und einfach den Tutorials folgen.
Crush
54
@crush n % 2 == 0bedeutet semantisch Divide by 2 and check if the remainder is 0, was viel klarer ist als n & 1 == 0was bedeutet Zero all the bits but leave the least significant bit unchanged and check if the result is 0. Die verbesserte Klarheit des ersten ist den (wahrscheinlich nicht vorhandenen) Aufwand wert. Das habe ich mit vorzeitiger Optimierung gemeint. Wenn etwas langsam ist und Sie es in diesem Teil profilieren n % 2, n & 1ist es sicherlich gerechtfertigt, es zu ändern , aber es vorher nicht zu tun. Im Allgemeinen ist es eine schlechte Idee, vor dem Profiling mit den Bitoperatoren zu arbeiten.
dtech
18
@dtech Zunächst einmal ist Ihre Meinung völlig subjektiv. Zweitens verstehen Sie immer noch nicht, was "vorzeitige Optimierung" bedeutet. Es ist sicher eine Mikrooptimierung. Es ist keine vorzeitige Optimierung. Bei der vorzeitigen Optimierung wird vorhandener Code mit "Optimierungen" überarbeitet, ohne zuvor den vorhandenen Code zu profilieren, um festzustellen, ob er ineffizient ist. Es ist jedoch KEINE vorzeitige Optimierung, vorher zu wissen, dass das Schreiben von Code auf eine oder eine andere Weise effizienter ist, und die Wahl, den effizienteren Code zu verwenden. Es ist Ihre subjektive Meinung, n % 2 == 0die sauberer ist als n & 1 == 0.
Crush
15
Ich möchte die Leute, die hierher kommen, nur darauf hinweisen, dass die Verwendung des Modulo-Operators in Ordnung ist. Wenn Sie ihn jedoch zum Testen der Seltsamkeit verwenden, schreiben Sie n% 2! = 0, nicht n% 2 == 1, da letzterer funktioniert nicht für negative Zahlen in Java.
Jxek
97
if((x%2)==0)
   // even
else
   // odd
poy
quelle
30

Wenn der Rest, wenn Sie durch 2 teilen, 0 ist, ist es gerade. %ist der Betreiber, um einen Rest zu erhalten.

Ryan Stewart
quelle
12
Der Operator% heißt modulo.
Anthony
4
@Anthony: Eigentlich ist es der " Restoperator " .
Ryan Stewart
3
Der mathematische Begriff ist Modul und hat eine breitere Anwendbarkeit als der Rest. (A % B)selbst kann als Ausdruck verwendet werden, und dann wird es lustig.
Stefan Kendall
2
@Stefan: Ich werde den Punkt nicht näher erläutern, aber Mathematiker neigen dazu, darauf hinzuweisen, dass in der modularen Arithmetik der Modul und der Rest nicht dasselbe sind .
Ryan Stewart
2
@StefanKendall Überprüfen Sie die Java-Sprachspezifikation # 15.17.3 . Google ist keine normative Referenz.
Marquis von Lorne
24

Der Restoperator% gibt Ihnen den Rest nach dem Teilen durch eine Zahl.

Also n % 2 == 0wird wahr sein, wenn n gerade ist und falsch, wenn n ungerade ist.

Phil
quelle
21

Jede gerade Zahl ist durch zwei teilbar, unabhängig davon, ob es sich um eine Dezimalzahl handelt (aber die Dezimalstelle muss, falls vorhanden, auch gerade sein). Sie können also den %Operator (Modulo) verwenden, der die Zahl links durch die Zahl rechts teilt und den Rest zurückgibt ...

boolean isEven(double num) { return ((num % 2) == 0); }
Feuerschatten52
quelle
1
"Unabhängig davon, ob es sich um eine Dezimalstelle handelt" ist bedeutungslos. Dezimal ist ein Radix. Meinen Sie "enthält einen Bruchteil"?
Marquis von Lorne
4

ich würde empfehlen

Java Puzzlers: Fallen, Fallstricke und Eckfälle Buch von Joshua Bloch und Neal Gafter

Es gibt eine kurze Erklärung, wie Sie überprüfen können, ob die Zahl ungerade ist. Der erste Versuch ist ähnlich wie bei @AseemYadav:

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

aber wie im Buch erwähnt wurde:

Wenn die Restoperation ein Ergebnis ungleich Null zurückgibt, hat sie das gleiche Vorzeichen wie der linke Operand

Also im Allgemeinen, wenn wir eine negative ungerade Zahl haben, dann statt 1 wir bekommen -1als Ergebnis i%2. Wir können also die @ Camilo-Lösung verwenden oder einfach Folgendes tun:

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

Aber im Allgemeinen ist die schnellste Lösung die Verwendung eines AND-Operators wie @lucasmo. Schreiben Sie oben:

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

@Edit Es lohnt sich auch darauf hinzuweisen, Math.floorMod(int x, int y);welche gut mit der negativen Dividende umgehen, aber auch zurückkehren können, -1wenn der Divisor negativ ist

Michu93
quelle
2

Funktioniert für positive oder negative Zahlen

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.
quelle
2

Das niedrigstwertige Bit (ganz rechts) kann verwendet werden, um zu überprüfen, ob die Zahl gerade oder ungerade ist. Für alle ungeraden Zahlen ist das Bit ganz rechts in der Binärdarstellung immer 1.

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

quelle
2

Dieses folgende Programm kann große Zahlen verarbeiten (Anzahl der Stellen größer als 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");

    }
}

Hier ist die Ausgabe ::

  122873215981652362153862153872138721637272
  Even
Titus Roby K.
quelle
1

Sie können den Moduloperator verwenden, dies kann jedoch langsam sein. Ein effizienterer Weg wäre, das niedrigste Bit zu überprüfen, da dies bestimmt, ob eine Zahl gerade oder ungerade ist. Der Code würde ungefähr so ​​aussehen:

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"));        
}
Schlag Chukandar Singh
quelle
1

Sie können dies tun:

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

Dies liegt daran, dass Java in seiner Modulo-Operation das Vorzeichen der Dividende auf der linken Seite hat: n. Für negative und positive Dividenden hat das Modulo das Vorzeichen von ihnen.

Natürlich ist die bitweise Operation schneller und optimiert. Dokumentieren Sie einfach die Codezeile mit zwei oder drei kurzen Wörtern, um die Lesbarkeit zu verbessern.

Camilo
quelle
Es wird der Restoperator genannt , nicht der Modulooperator.
Marquis von Lorne
1

Ein weiterer einfacher Weg, dies ohne die if / else-Bedingung zu tun (funktioniert sowohl für positive als auch für negative Zahlen):

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

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

Für eine ungerade Nr. Gibt der Ausdruck als Rest '1' zurück und gibt

messages.get (1) = 'ungerade' und damit 'ungerade' drucken

Andernfalls wird 'gerade' gedruckt, wenn der Ausdruck das Ergebnis '0' ergibt.

Aseem Yadav
quelle
1
Diese Frage wurde als JAVA markiert. Sie haben eine Antwort in Python gepostet. Nicht wirklich nützlich.
Mark
Hey @Mark! Vielen Dank für den Hinweis, die Antwort bearbeitet. Hoffe, diesmal kann es jemandem noch weiterhelfen.
Aseem Yadav
1
Es kann leicht zum Absturz gebracht werden, zum Beispiel durch : int n = -3;. Wie @Camilo unten erwähnt - wenn die verbleibende Operation ein Ergebnis ungleich Null zurückgibt, hat sie das gleiche Vorzeichen wie ihr linker Operand, so allgemein, dass wir das haben, System.out.println(messages.get(-1));was uns gibtjava.lang.ArrayIndexOutOfBoundsException
Michu93
1

Wenn der Modul der gegebenen Zahl gleich Null ist, ist die Zahl gerade oder eine ungerade Zahl. Unten ist die Methode, die das macht:

public void evenOrOddNumber(int number) {
  if (number % 2 == 0) {
    System.out.println("Number is Even");
   } else {
    System.out.println("Number is odd");
  }
 }
corneliouz Bett
quelle
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);
    }
}
Bob
quelle
Was ist der Zweck von '?' Zeichen
Rana Talha Tariq
0

Hier ist ein Beispiel, um festzustellen, ob eine bestimmte Zahl gerade oder ungerade ist.

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

Nun, es gibt viele Möglichkeiten, dasselbe zu bestimmen. In dieser Ressource finden Sie weitere Beispiele, um festzustellen, ob die angegebene Zahl gerade oder ungerade ist.

Shiva
quelle
0

Hier ist ein vollständiges Beispiel: -

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

Geben Sie hier die Bildbeschreibung ein

Vipul Gulhane
quelle