检查数字是偶数还是奇数


128

如何确定给定数字是偶数还是奇数?我很久以来一直想弄清楚这个问题,而且还没到任何地方。

Answers:


200

您可以使用模运算符,但这可能很慢。如果是整数,则可以执行以下操作:

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

这是因为低位将始终设置为奇数。


23
仍然令我惊讶的是,人们更喜欢模数而不是简单地检查数字的第一位。显然,如果设置了第一位,则数字必须为奇数。通常它速度更快,在我看来它的读取效果也一样。我认为其他人不喜欢模数的原因归结于对二进制的缺乏了解。
暗恋

5
@dtech我认为您误解了过早优化的含义。如果您事先知道一种方法比另一种方法具有更高的性能,那么使用性能更高的方法并不是过早的优化。很聪明 就是说,我的评论更多是关于在仅检查偶数/奇数时检查第一位比使用模数更具逻辑性。问题在于,许多程序员不了解这两种方法的作用,而只是按照教程进行操作。
2014年

54
@crush的n % 2 == 0语义含义Divide by 2 and check if the remainder is 0n & 1 == 0这更清楚Zero all the bits but leave the least significant bit unchanged and check if the result is 0。前者提高的清晰度值得(可能不存在)开销。这就是我所说的过早优化。如果某样东西很慢,您的个人资料就在该部分改变n % 2n & 1肯定是有道理的,但事前做事实并非如此。通常,在进行分析之前,与位运算符一起工作是一个坏主意。
dtech 2014年

18
@dtech首先,您的意见完全是主观的。第二,您仍然不了解“过早优化”的含义。当然,这是一个微优化。这不是过早的优化。过早的优化是通过“优化”来修改现有的代码,而无需首先对现有的代码进行性能分析以查看其效率低下。但是,事先知道以一种方式与另一种方式编写代码效率更高,并且选择使用效率更高的代码并不是过早的优化。这是你的主观认为n % 2 == 0清洁n & 1 == 0
2014年

15
我想向来这里的人指出使用模运算符很好,但是如果您要使用它来测试奇数,请写n%2!= 0,而不是n%2 == 1,因为后者在Java中不适用于负数。
Jxek

98
if((x%2)==0)
   // even
else
   // odd

30

如果除以2时的余数为0,则为偶数。%是获得余数的运算符。


12
%运算符称为模。
安东尼

4
@Anthony:实际上,它是“余数运算符”
瑞安·斯图尔特

3
数学术语是模数,并且比获得余数具有更广泛的适用性。(A % B)本身可以用作表达式,这就是事情变得有趣的时候。
Stefan Kendall'9

2
@Stefan:我不会太在意这一点,但是数学家倾向于指出,在模算术中,模数和余数不是一回事
瑞安·斯图尔特

2
@StefanKendall检查Java语言规范#15.17.3。Google不是规范性参考。
罗恩侯爵

24

余数运算符%将除以数字后得到余数。

所以,n % 2 == 0当n为偶数和虚假如果n是奇数将是真实的。


21

每个偶数都可以被二整除,而不管它是不是十进制(但是十进制,如果存在的话,也必须是偶数)。因此,您可以使用%(模)运算符,该运算符将左侧的数字除以右侧的数字并返回余数...

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

1
“不管它是否是小数”都是没有意义的。小数是一个基数。您是说“包含小数部分”吗?
罗恩侯爵

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

但通常最快的解决方案是使用AND运算符,例如@lucasmo,如上所示:

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

最低有效位(最右边)可用于检查数字是偶数还是奇数。对于所有奇数,二进制表示形式中最右边的位始终为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。因此,对于负数和正数的股息,取模具有其符号。

当然,按位运算是更快和最优化的,只需用两个或三个短字记录代码行即可,以提高可读性。


它称为余数运算符,而不是模运算符。
罗恩侯爵

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

1
它可以很容易地崩溃,例如:int n = -3;。就像@Camilo在下面提到的那样-当余数运算返回非零结果时,它与左运算数具有相同的符号,因此,慷慨地,我们得到System.out.println(messages.get(-1));了给我们java.lang.ArrayIndexOutOfBoundsException
Michu93 '18

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

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.