ตรวจสอบว่าเป็นเลขคู่หรือคี่


128

ฉันจะทราบได้อย่างไรว่าตัวเลขที่กำหนดเป็นเลขคู่หรือคี่ ฉันอยากจะคิดเรื่องนี้มานานแล้วและไม่ได้ไปไหนเลย

คำตอบ:


201

คุณสามารถใช้ตัวดำเนินการโมดูลัส แต่อาจช้า หากเป็นจำนวนเต็มคุณสามารถทำสิ่งต่อไปนี้

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
ฉันแค่อยากจะชี้ให้เห็นว่าคนที่มาที่นี่ว่าการใช้ตัวดำเนินการ modulo นั้นใช้ได้ แต่ถ้าคุณใช้มันเพื่อทดสอบความแปลกประหลาดเขียน n% 2! = 0 ไม่ใช่ n% 2 == 1 เพราะหลัง ใช้ไม่ได้กับจำนวนลบใน Java
Jxek


30

หากส่วนที่เหลือเมื่อคุณหารด้วย 2 เป็น 0 มันจะเท่ากับ %เป็นผู้ประกอบการที่จะได้รับส่วนที่เหลือ


12
ตัวดำเนินการ% เรียกว่าโมดูโล
แอนโธนี

4
@Anthony: จริงๆแล้วมันเป็น"ผู้ประกอบการที่เหลือ"
Ryan Stewart

3
ศัพท์ทางคณิตศาสตร์คือโมดูลัสและมีการบังคับใช้ที่กว้างกว่าการได้รับส่วนที่เหลือ (A % B)ตัวเองสามารถใช้เป็นนิพจน์และนั่นคือเมื่อสิ่งที่สนุก
Stefan Kendall

2
@ Stefan: ฉันจะไม่เหยียดหยามจุด แต่นักคณิตศาสตร์ที่มีแนวโน้มที่จะชี้ให้เห็นว่าในทางคณิตศาสตร์แบบโมดูลาร์โมดูลัสและส่วนที่เหลือไม่ได้ในสิ่งเดียวกัน
Ryan Stewart

2
@StefanKendall ตรวจสอบJava Language ข้อกำหนด # Google ไม่ใช่ข้อมูลอ้างอิงเชิงบรรทัดฐาน
มาร์ควิสแห่ง Lorne

24

ตัวดำเนินการส่วนที่เหลือ% จะให้ส่วนที่เหลือหลังจากหารด้วยตัวเลข

ดังนั้นn % 2 == 0จะเป็นจริงถ้า n เป็นเลขคู่และเท็จถ้า n เป็นเลขคี่


21

ทุกเลขคู่จะหารด้วยสองโดยไม่คำนึงว่าจะเป็นทศนิยมหรือไม่ (แต่ถ้าเป็นทศนิยมจะต้องเป็นเลขคู่ด้วย) ดังนั้นคุณสามารถใช้%โอเปอเรเตอร์ (modulo) ซึ่งจะหารตัวเลขทางซ้ายด้วยตัวเลขทางด้านขวาและส่งกลับค่าเศษที่เหลือ ...

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

1
'ไม่ว่าจะเป็นทศนิยมหรือไม่' ก็ไร้ความหมาย ทศนิยมคือเลขฐานสิบ คุณหมายถึง 'ประกอบด้วยส่วนที่เป็นเศษส่วน' หรือไม่
มาร์ควิสแห่ง Lorne

4

ฉันจะแนะนำ

Java Puzzlers: Traps, Pitfalls และ Corner Cases Book โดย Joshua Bloch และ Neal Gafter

มีคำอธิบายสั้น ๆ ว่าจะตรวจสอบว่าเป็นเลขคี่หรือไม่ ลองครั้งแรกเป็นสิ่งที่คล้ายกับสิ่งที่ @AseemYadav พยายาม:

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

แต่ดังที่ถูกกล่าวถึงในหนังสือ:

เมื่อการดำเนินการที่เหลือส่งกลับผลลัพธ์ที่ไม่ใช่ศูนย์จะมีเครื่องหมายเช่นเดียวกับตัวถูกดำเนินการด้านซ้าย

ดังนั้นโดยทั่วไปเมื่อเรามีเลขคี่เชิงลบจากนั้นแทน1เราจะได้รับเป็นผลมาจาก-1 i%2ดังนั้นเราสามารถใช้ @Camilo solution หรือเพียงแค่ทำ:

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

แต่โดยทั่วไปวิธีแก้ปัญหาที่เร็วที่สุดคือการใช้ตัวดำเนินการ AND เช่น @lucasmo เขียนด้านบน:

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

@ แก้ไขมันก็คุ้มที่จะชี้ให้เห็น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 ดังนั้นสำหรับเงินปันผลเชิงลบและบวกโมดูโลมีสัญลักษณ์ของพวกเขา

แน่นอนว่าการดำเนินการระดับบิตนั้นเร็วขึ้นและได้รับการปรับให้เหมาะสมที่สุดเพียงแค่บันทึกบรรทัดโค้ดด้วยคำสั้น ๆ สองหรือสามคำซึ่งช่วยให้อ่านได้ง่าย


มันถูกเรียกว่าตัวดำเนินการส่วนที่เหลือไม่ใช่ตัวดำเนินการแบบโมดูโล
มาร์ควิสแห่ง 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) = 'คี่' และด้วยเหตุนี้การพิมพ์ 'คี่'

อื่น ๆ 'คู่' จะถูกพิมพ์เมื่อนิพจน์เกิดขึ้นพร้อมกับผลลัพธ์ '0'


1
คำถามนี้ถูกแท็กเป็น JAVA คุณโพสต์คำตอบใน Python ไม่มีประโยชน์จริง ๆ
ทำเครื่องหมาย

เฮ้ @ มาร์ค! ขอบคุณสำหรับการชี้ว่าแก้ไขคำตอบ หวังว่าคงได้รับความช่วยเหลือจากใครบางคนในเวลานี้
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");
  }
 }

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

จุดประสงค์ของ 'อะไร' sign
Rana Talha Tariq

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

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.