【问题标题】:Check whether number is even or odd检查数字是偶数还是奇数
【发布时间】:2011-11-12 14:56:57
【问题描述】:

如何确定给定数字是偶数还是奇数?我一直想弄清楚这个问题很长时间了,但一直没有得到任何结果。

【问题讨论】:

    标签: java


    【解决方案1】:

    这是一个判断给定数字是偶数还是奇数的示例,

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

    嗯,有很多方法可以确定。有关更多示例,请参阅this 资源以查找给定数字是偶数还是奇数。

    【讨论】:

      【解决方案2】:
      if ((x % 2) == 0) {
         // even
      } else {
         // odd
      }
      

      【讨论】:

        【解决方案3】:
            /**
             * Check if a number is even or not using modulus operator.
             *
             * @param number the number to be checked.
             * @return {@code true} if the given number is even, otherwise {@code false}.
             */
            public static boolean isEven(int number) {
                return number % 2 == 0;
            }
        
            /**
             * Check if a number is even or not using & operator.
             *
             * @param number the number to be checked.
             * @return {@code true} if the given number is even, otherwise {@code false}.
             */
            public static boolean isEvenFaster(int number) {
                return (number & 1) == 0;
            }
        

        source

        【讨论】:

          【解决方案4】:

          下面这个程序可以处理大数(位数大于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
          

          【讨论】:

            【解决方案5】:

            如果给定数的模数为零,则该数为偶数,否则为奇数。以下是执行此操作的方法:

            public void evenOrOddNumber(int number) {
              if (number % 2 == 0) {
                System.out.println("Number is Even");
               } else {
                System.out.println("Number is odd");
              }
             }
            

            【讨论】:

              【解决方案6】:

              我会推荐

              Java Puzzlers: Traps, Pitfalls, and Corner Cases Book by Joshua Bloch 和尼尔·加夫特

              有一个简要说明如何检查数字是否为奇数。 第一次尝试与@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;
              }
              

              @编辑 还值得指出Math.floorMod(int x, int y);,它可以很好地处理负除数,但如果除数为负,也可以返回-1

              【讨论】:

                【解决方案7】:

                最低有效位(最右边)可用于检查数字是偶数还是奇数。 对于所有奇数,二进制表示中最右边的位始终为 1。

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

                【讨论】:

                  【解决方案8】:

                  另一种不使用 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”时打印“偶数”

                  【讨论】:

                  • 这个问题被标记为 JAVA。您在 Python 中发布了答案。真的没那么有用。
                  • 嘿@Mark!感谢您指出这一点,编辑了答案。希望,这次它仍然可以对某人有所帮助。
                  • 它很容易崩溃,例如:int n = -3;。正如下面提到的@Camilo - 当余数运算返回非零结果时,它与左操作数具有相同的符号,所以通常我们有System.out.println(messages.get(-1)); 给我们java.lang.ArrayIndexOutOfBoundsException
                  【解决方案9】:

                  这里是完整的例子:-

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

                  【讨论】:

                    【解决方案10】:

                    你可以这样做:

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

                    这是因为 Java 在其模运算中具有被除数的符号,左侧:n。 因此,对于负数和正数红利,模数具有它们的符号。

                    当然,按位运算更快更优化,只需将代码行用两三个短的单词记录下来,这样可以提高可读性。

                    【讨论】:

                    【解决方案11】:

                    您可以使用取模运算符,但这可能会很慢。一种更有效的方法是检查最低位,因为它决定了一个数字是偶数还是奇数。代码看起来像这样:

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

                    【讨论】:

                      【解决方案12】:

                      每个偶数都可以被 2 整除,无论它是否是小数(但小数,如果存在,也必须是偶数)。所以你可以使用%(取模)运算符,它将左边的数字除以右边的数字,然后返回余数……

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

                      【讨论】:

                      • '不管它是否是小数'是没有意义的。小数是基数。您的意思是“包含小数部分”吗?
                      【解决方案13】:

                      余数运算符 % 将给出除以数字后的余数。

                      所以n % 2 == 0 在 n 为偶数时为真,在 n 为奇数时为假。

                      【讨论】:

                        【解决方案14】:
                        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);
                            }
                        }
                        

                        【讨论】:

                        • '?' 的用途是什么?签到
                        【解决方案15】:

                        适用于正数或负数

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

                        【讨论】:

                          【解决方案16】:

                          您可以使用取模运算符,但这可能会很慢。如果是整数,可以这样做:

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

                          这是因为低位总是设置为奇数。

                          【讨论】:

                          • 令我惊讶的是,人们更喜欢模数而不是简单地检查数字的第一位。显然,如果第一位被设置,那么这个数字一定是奇数。它通常更快,而且在我看来它读起来也一样好。我认为其他人不喜欢它而不是模数的原因归结为对二进制缺乏了解。
                          • @dtech 我认为您误解了过早优化的含义。如果您事先知道一种方法比另一种方法性能更高,那么使用性能更高的方法并不是过早的优化。它很聪明。也就是说,我的评论更多是关于在简单地检查偶数/奇数时检查第一位比使用模数更合乎逻辑。问题是很多程序员不明白这两种方法的作用,只是跟着教程。
                          • @crush n % 2 == 0 语义上表示Divide by 2 and check if the remainder is 0,比n &amp; 1 == 0 更清晰,表示Zero all the bits but leave the least significant bit unchanged and check if the result is 0。第一个改进的清晰度值得(可能不存在)开销。这就是我所说的过早优化的意思。如果某些事情很慢,并且您在该部分中将其分析为将n % 2 更改为n &amp; 1 肯定是合理的,但事先这样做是不合理的。一般来说,在分析之前使用位运算符是一个坏主意。
                          • @dtech 首先,您的意见完全是主观的。其次,你还是不明白“过早优化”是什么意思。当然,这是一个微优化。这不是过早的优化。过早的优化是使用“优化”修改现有代码,而不首先分析现有代码以查看其效率低下。但是,事先知道以一种方式编写代码比另一种方式更有效,并选择使用更高效的代码,这并不是过早的优化。您的主观意见是n % 2 == 0n &amp; 1 == 0更干净
                          • 我想向来这里的人指出,使用模运算符很好,但如果你用它来测试奇数,请写 n % 2 != 0,而不是 n % 2 == 1,因为后者不适用于 Java 中的负数。
                          【解决方案17】:

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

                          【讨论】:

                          猜你喜欢
                          • 2015-05-31
                          • 1970-01-01
                          • 2023-01-20
                          • 1970-01-01
                          • 2015-03-03
                          • 2010-09-14
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多