数が偶数か奇数かを確認する


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。1つ目の改善された明快さは、(おそらく存在しない)オーバーヘッドの価値があります。それは私が時期尚早な最適化で意味したものです。何かが遅く、その部分をプロファイルする場合、変更するn % 2ことn & 1は確かに正当化されますが、事前に行うことは正当化されません。一般に、ビット演算子を使用することは、プロファイリングの前に悪い考えです。
dtech

18
@dtechまず第一に、あなたの意見は完全に主観的です。第二に、「時期尚早の最適化」の意味をまだ理解していません。確かにミクロの最適化です。これは時期尚早の最適化ではありません。時期尚早な最適化とは、既存のコードを非効率的にするために既存のコードを最初にプロファイリングせずに、「最適化」で既存のコードを修正することです。ただし、ある方法で別の方法でコードを書く方が効率的であり、より効率的なコードを使用することを選択することは、時期尚早な最適化ではありません。それはあなたの主観的な意見ですn % 2 == 0ですクリーナーよりn & 1 == 0
クラッシュ

15
モジュロ演算子の使用は問題ないことをここに来る人々に指摘したいのですが、それを使用して奇数性をテストする場合は、n%2 == 1ではなくn%2!= 0と記述します。 Javaでは負の数に対しては機能しません。
Jxek、2015年


30

2で除算したときの余りが0であれば、それは偶数です。%剰余を取得する演算子です。


12
%演算子はモジュロと呼ばれます。
アンソニー

4
@Anthony:実際には、これは「剰余演算子」です。
ライアンスチュワート

3
数学用語はモジュラスであり、剰余を取得するよりも適用範囲が広くなります。(A % B)それ自体を表現として使うことができ、それが物事が楽しくなるときです。
Stefan Kendall

2
@Stefan:私は要点を明かしませんが、数学者はモジュラー算術ではモジュラスと剰余は同じものではないことを指摘する傾向があります。
Ryan Stewart

2
@StefanKendall Java言語仕様# 15.17.3を確認してください。Googleは規範的な参照ではありません。
ローンの侯爵

24

剰余演算子%は、数値で除算した後の剰余を返します。

したがってn % 2 == 0、nが偶数の場合はtrueになり、nが奇数の場合はfalseになります。


21

小数かどうかに関係なく、すべての偶数は2で割り切れます(ただし、小数がある場合は、それも偶数でなければなりません)。したがって、%(モジュロ)演算子を使用できます。この演算子は、左側の数値を右側の数値で割り、剰余を返します...

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

1
「10進数かどうかに関係なく」は意味がありません。10進数は基数です。「小数部分を含む」という意味ですか?
ローンの侯爵

4

私がお勧めします

Javaパズル:トラップ、落とし穴、コーナーケースブックJoshua BlochとNeal Gafter

数が奇数かどうかを確認する方法の簡単な説明があります。最初の試行は、@ 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;
}

しかし、一般的に最速の解決策は、上記の@lucasmoのようにAND演算子を使用することです。

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

最下位ビット(右端)を使用して、数値が偶数か奇数かを確認できます。すべての奇数の場合、右端のビットは常に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があるためです。したがって、マイナスとプラスの配当の場合、モジュロにはそれらの符号があります。

もちろん、ビット単位の操作はより高速で最適化されています。コード行を2〜3つの短い単語で文書化するだけで、読みやすくなります。


これは剰余演算子ではなく、剰余演算と呼ばれます。
ローン侯爵

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)= 'odd'、したがって 'odd'を出力する

それ以外の場合、式が結果「0」になると「偶数」が出力されます


1
この質問にはJAVAのタグが付けられています。Pythonで回答を投稿しました。それほど役に立ちません。
マーク

@Markさん、こんにちは。指摘いただきありがとうございます。回答を編集しました。今度はそれが誰かの助けになることを願っています。
Aseem Yadav 2017

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

「?」の目的は何ですか サイン
Rana Talha Tariq 2017

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.