Java 检查闰年-不使用除法运算

Java 检查闰年-不使用除法运算,java,algorithm,leap-year,Java,Algorithm,Leap Year,如何检查给定年份是否为闰年,而不使用除法或除法运算 Java中的一些库方法。是否可以使用位运算符检查此问题 PS:验证在几个世纪内都不是必需的这里有一些不用模函数识别闰年的方法 首先,让我们假设(或测试)年份在范围1901-2099内 以二进制数表示的闰年将以00作为 最后两位数。因此: 如果年份&(不是4)=0,则为闰年 如果有一个函数可以将实数截断为 整数那么这就行了: x=trunc(年份/4) 如果x*4==年,那就是闰年 如果你有移位(不是循环移位)操作符,我确信 Verilog当时

如何检查给定年份是否为闰年,而不使用除法或除法运算 Java中的一些库方法。是否可以使用位运算符检查此问题


PS:验证在几个世纪内都不是必需的

这里有一些不用模函数识别闰年的方法

首先,让我们假设(或测试)年份在范围
1901-2099

  • 以二进制数表示的闰年将以
    00
    作为 最后两位数。因此:

    如果年份&(不是4)=0,则为闰年

  • 如果有一个函数可以将实数截断为 整数那么这就行了:

    x=trunc(年份/4)

    如果x*4==年,那就是闰年

  • 如果你有移位(不是循环移位)操作符,我确信 Verilog当时:

    x=年份>>2


    这是闰年
    if(x这里有一些不用模函数识别闰年的方法

    首先,让我们假设(或测试)年份在范围
    1901-2099

    • 以二进制数表示的闰年将以
      00
      作为 最后两位数字。所以:

      如果年份&(不是4)=0,则为闰年

    • 如果有一个函数可以将实数截断为 整数那么这就行了:

      x=trunc(年份/4)

      如果x*4==年,那就是闰年

    • 如果你有移位(不是循环移位)操作符,我确信 Verilog当时:

      x=年份>>2


      这是闰年
      if(x好的,当然。因为除法或mod除以2的幂(在本例中为4),只是一点检查

      boolean isLeapYear( int year ) {
          return (( year & 3 ) == 0 );  // if the bottom two bits are 0, then the int is divisible by 4
      }
      

      请注意,这并不完美,因为有些世纪不是闰年,但这似乎与您的问题无关(如您现在所述)。

      好吧,当然。因为除法或模幂2(在本例中为4)只是一点检查

      boolean isLeapYear( int year ) {
          return (( year & 3 ) == 0 );  // if the bottom two bits are 0, then the int is divisible by 4
      }
      

      请注意,这并不完美,因为有些世纪不是闰年,但这似乎与您的问题无关(如您现在所述).

      是的,您可以不使用任何算术运算来完成。使用从年份映射到布尔值的映射-无论年份是闰年还是否。

      是的,您可以不使用任何算术运算来完成。使用从年份映射到布尔值的映射-无论年份是闰年还是否。

      • 如果一年是一个世纪年,意味着可以被100整除,那么它需要被400整除才能被称为闰年

      • 如果一年不是百年,那么它需要被4整除才能称为闰年

      下面的代码使用二进制搜索检查一个数字是否可被另一个数字整除(由于不允许使用/,我不确定您是否可以使用%

      公共静态布尔值isLeapYear(整数年){
      返回可分割(1,年,100,年)?可分割(1,年,400,年):可分割(1,年,4,年);
      }
      私有静态布尔值是可分的(整数低、整数高、整数除数、整数被除数){
      int-mid=0;
      而(低>1);
      int结果=除数*中间;
      如果(结果==股息)返回true;
      否则,如果(结果>股息)高=中-1;
      否则低=中+1;
      }
      返回false;
      }
      
      • 如果一年是一个世纪年,意味着可以被100整除,那么它需要被400整除才能被称为闰年

      • 如果一年不是百年,那么它需要被4整除才能称为闰年

      下面的代码使用二进制搜索检查一个数字是否可被另一个数字整除(由于不允许使用/,我不确定您是否可以使用%

      公共静态布尔值isLeapYear(整数年){
      返回可分割(1,年,100,年)?可分割(1,年,400,年):可分割(1,年,4,年);
      }
      私有静态布尔值是可分的(整数低、整数高、整数除数、整数被除数){
      int-mid=0;
      而(低>1);
      int结果=除数*中间;
      如果(结果==股息)返回true;
      否则,如果(结果>股息)高=中-1;
      否则低=中+1;
      }
      返回false;
      }
      
      您应该更具体地说明您的需求,这是一个程序员网站:)


      您应该更具体地说明您的需求,这是一个程序员网站:)

      模运算符(
      %
      )算是一个选项吗?出于好奇,为什么除法不是一种选择?@N247可能是学生的家庭作业挑战。否则,简单的解决方案是:
      java.time.Year.isLeap(2018)
      你能不能问一下你是否需要检查几个世纪?
      返回((年&3)==0;
      要检查世纪年,你需要模运算(这是一种除法运算):
      返回((年&3)==0&((年%25)!=0 | |(年&15)==0));
      更多内容:模运算(
      %
      )算作选项吗?出于好奇,为什么除法不是选项?@n247对学生来说可能是一个家庭作业挑战。否则,简单的解决方案是:
      java.time.Year.isLeap(2018)
      你能问一下你是否需要检查百年吗?
      返回((年&3)==0;
      要检查百年,你需要模运算(这是一种除法运算):
      返回((年&3)==0&((年%25)!=0 | |(年&15)==0))
      更多信息:那么,单独向地图添加值?那么,单独向地图添加值?
      Year.isLeap(someYear)