Kiểm tra xem số chẵn hay lẻ


128

Làm thế nào tôi có thể xác định xem một số đã cho là chẵn hay lẻ? Tôi đã muốn tìm hiểu điều này từ lâu và không đi đến đâu cả.

Câu trả lời:


200

Bạn có thể sử dụng toán tử mô đun, nhưng điều đó có thể chậm. Nếu đó là một số nguyên, bạn có thể làm:

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

Điều này là do bit thấp sẽ luôn được đặt trên một số lẻ.


23
Tôi vẫn ngạc nhiên khi mọi người thích mô-đun hơn chỉ đơn giản là kiểm tra bit đầu tiên của số. Rõ ràng nếu bit đầu tiên được đặt, thì số phải là số lẻ. Nó thường nhanh hơn, và nó cũng đọc theo ý kiến ​​của tôi. Tôi nghĩ lý do những người khác không thích nó hơn mô-đun là do thiếu hiểu biết về nhị phân.
nghiền nát

5
@dtech Tôi nghĩ bạn hiểu sai ý nghĩa của tối ưu hóa sớm. Nếu bạn biết trước rằng một phương thức có hiệu suất cao hơn phương thức khác, thì đó không phải là tối ưu hóa sớm để sử dụng phương thức hiệu quả hơn. Thật thông minh. Điều đó nói rằng, nhận xét của tôi là về cách kiểm tra bit đầu tiên hợp lý hơn so với sử dụng mô đun khi chỉ cần kiểm tra chẵn / lẻ. Vấn đề là nhiều lập trình viên không hiểu phương pháp nào làm được, và chỉ làm theo hướng dẫn.
nghiền nát

54
@crush n % 2 == 0có nghĩa là về mặt ngữ nghĩa Divide by 2 and check if the remainder is 0, rõ ràng hơn nhiều so với n & 1 == 0nghĩa là gì Zero all the bits but leave the least significant bit unchanged and check if the result is 0. Sự rõ ràng được cải thiện của lần đầu tiên có giá trị (có lẽ không tồn tại). Đó là những gì tôi có nghĩa là tối ưu hóa sớm. Nếu một cái gì đó chậm và bạn cấu hình nó trong phần đó thay đổi n % 2thành n & 1chắc chắn là hợp lý, nhưng làm nó trước thì không. Nói chung làm việc với các toán tử bit là một ý tưởng tồi trước khi định hình.
dtech

18
@dtech Trước hết, ý kiến ​​của bạn là hoàn toàn chủ quan. Thứ hai, bạn vẫn không hiểu "tối ưu hóa sớm" nghĩa là gì. Đó là một tối ưu hóa vi mô, chắc chắn. Nó không phải là một tối ưu hóa sớm. Tối ưu hóa sớm đang sửa đổi mã hiện có với "tối ưu hóa" mà không cần lược tả trước mã hiện tại để thấy rằng nó không hiệu quả. Tuy nhiên, biết trước rằng viết mã theo cách này so với cách khác hiệu quả hơn và chọn sử dụng mã hiệu quả hơn, KHÔNG phải là tối ưu hóa sớm. Đó là ý kiến ​​chủ quan của bạn n % 2 == 0sạch hơn n & 1 == 0.
nghiền nát

15
Tôi chỉ muốn chỉ ra cho mọi người đến đây rằng sử dụng toán tử modulo là tốt, nhưng nếu bạn đang sử dụng nó để kiểm tra độ lạ, hãy viết n% 2! = 0, không phải n% 2 == 1, vì sau này không hoạt động đối với các số âm trong Java.
Jxek 8/1/2015


30

Nếu phần còn lại khi bạn chia cho 2 là 0, thì đó là số chẵn. %là nhà điều hành để có được một phần còn lại.


12
Toán tử% được gọi là modulo.
Anthony

4
@Anthony: Thật ra, đó là "toán tử còn lại" .
Ryan Stewart

3
Thuật ngữ toán học là mô-đun, và nó có tính ứng dụng rộng hơn so với phần còn lại. (A % B)chính nó có thể được sử dụng như một biểu thức, và đó là khi mọi thứ trở nên vui vẻ.
Stefan Kendall

2
@Stefan: Tôi sẽ không tin vào quan điểm, nhưng các nhà toán học có xu hướng chỉ ra rằng trong số học mô-đun, mô- đun và phần còn lại không giống nhau .
Ryan Stewart

2
@StefanKendall Kiểm tra Đặc tả ngôn ngữ Java # 15.17.3 . Google không phải là một tài liệu tham khảo quy phạm.
Hầu tước Lorne

24

Toán tử còn lại,%, sẽ cung cấp cho bạn phần còn lại sau khi chia cho một số.

Vậy n % 2 == 0sẽ đúng nếu n chẵn và sai nếu n là số lẻ.


21

Mỗi số chẵn chia hết cho hai, bất kể đó là số thập phân (nhưng số thập phân, nếu có, cũng phải là số chẵn). Vì vậy, bạn có thể sử dụng %toán tử (modulo), chia số bên trái cho số bên phải và trả về phần còn lại ...

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

1
'Bất kể đó là số thập phân' là vô nghĩa. Số thập phân là một cơ số. Ý bạn là 'chứa một phần phân số'?
Hầu tước Lorne

4

Tôi muốn giới thiệu

Java Puzzlers: Bẫy, cạm bẫy và các vụ án góc của Joshua Bloch và Neal Gafter

Có một lời giải thích ngắn gọn làm thế nào để kiểm tra nếu số là số lẻ. Lần thử đầu tiên là thứ tương tự như những gì @AseemYadav đã thử:

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

nhưng như đã được đề cập trong cuốn sách:

khi hoạt động còn lại trả về kết quả khác 0, nó có cùng dấu với toán hạng bên trái của nó

Vì vậy, nói chung khi chúng ta có số lẻ âm thay vì 1chúng ta sẽ nhận được -1kết quả là i%2. Vì vậy, chúng ta có thể sử dụng giải pháp @Camilo hoặc chỉ cần làm:

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

nhưng nói chung, giải pháp nhanh nhất là sử dụng toán tử AND như @lucasmo viết ở trên:

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

@ Chỉnh sửa Cũng đáng để chỉ ra Math.floorMod(int x, int y);rằng điều này có lợi cho việc chia cổ tức âm nhưng cũng có thể trả lại -1nếu số chia là âm


2

Hoạt động cho số dương hoặc âm

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

Ít nhất có thể sử dụng bit (ngoài cùng bên phải) để kiểm tra xem số chẵn hay lẻ. Đối với tất cả các số lẻ, bit ngoài cùng bên phải luôn là 1 trong biểu diễn nhị phân.

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

2

Chương trình sau đây có thể xử lý số lượng lớn (số chữ số lớn hơn 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");

    }
}

Đây là đầu ra ::

  122873215981652362153862153872138721637272
  Even

1

Bạn có thể sử dụng toán tử mô đun, nhưng điều đó có thể chậm. Một cách hiệu quả hơn sẽ là kiểm tra bit thấp nhất bởi vì điều đó xác định xem một số chẵn hay lẻ. Mã sẽ trông giống như thế này:

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

Bạn có thể làm như thế này:

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

Điều này là do Java có hoạt động modulo của nó, dấu hiệu của cổ tức, bên trái: n. Vì vậy, đối với cổ tức tiêu cực và tích cực, modulo có dấu hiệu của chúng.

Tất nhiên, hoạt động bitwise nhanh hơn và được tối ưu hóa, chỉ cần ghi lại dòng mã bằng hai hoặc ba từ ngắn, để làm cho nó dễ đọc.


Nó được gọi là toán tử còn lại , không phải toán tử modulo.
Hầu tước Lorne

1

Một cách dễ dàng khác để làm điều đó mà không cần sử dụng điều kiện if / other (hoạt động cho cả số dương và số âm):

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

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

Đối với số lẻ, biểu thức sẽ trả về '1' như phần còn lại, cho

tin nhắn.get (1) = 'lẻ' và do đó in 'lẻ'

khác, 'chẵn' được in khi biểu thức xuất hiện với kết quả '0'


1
Câu hỏi này đã được gắn thẻ là JAVA. Bạn đã đăng một câu trả lời bằng Python. Không thực sự hữu ích.
Đánh dấu

Này @Mark! Cảm ơn đã chỉ ra rằng, chỉnh sửa câu trả lời. Hy vọng, lần này nó vẫn có thể giúp được ai đó.
Aseem Yadav

1
Nó có thể dễ dàng bị hỏng ví dụ bởi : int n = -3;. Như @Camilo đã đề cập dưới đây - khi hoạt động còn lại trả về kết quả khác không, nó có cùng dấu hiệu với toán hạng bên trái của nó, vì vậy chúng tôi có System.out.println(messages.get(-1));những gì mang lại cho chúng tôijava.lang.ArrayIndexOutOfBoundsException
Michu93

1

Nếu mô đun của số đã cho bằng 0, số đó là số lẻ khác. Dưới đây là phương pháp thực hiện điều đó:

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

Mục đích của 'là gì?' ký
Rana Talha Tariq

0

Đây là một ví dụ để xác định xem một số đã cho là chẵn hay lẻ,

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

Vâng, có nhiều cách để xác định giống nhau. Tham khảo tài nguyên này để biết thêm ví dụ để tìm số đã cho là chẵn hoặc lẻ.


0

Dưới đây là ví dụ đầy đủ: -

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

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.