检查Le年-不使用除法运算

时间:2018-09-04 03:58:25

标签: java algorithm leap-year

如何在不使用除法运算的情况下检查给定年份是否为a年或 Java中的一些库方法。是否可以使用按位运算符进行检查?

PS:几个世纪以来没有必要进行验证

5 个答案:

答案 0 :(得分:3)

这里有一些不使用模函数即可识别leap年的方法。

首先,我们假设(或测试)年份在=IF(AND(VALUE(LEFT(A$1, FIND(" ", A$1&" ")))<=E2, VALUE(REPLACE(A$1, 1, FIND("~", A$1&"~"), ""))>=E2), B$1, "out of range") 范围内。

  • 用二进制数表示的leap年将以1901 - 2099作为 后两位数字。所以:

    这是a年00

  • 如果您有一个函数可以将实数截断为 整数则有效:

    if year & (not 4) == 0

    这是a年x = trunc(year / 4)

  • 如果您有移位(非循环移位)运算符,我相信 然后,Verilog具有:

    if x * 4 == year

    这是a年x = year >> 2

如果关于范围为if (x << 2) == year的假设是错误的,那么您将需要一些额外的逻辑来消除1901 - 2099

答案 1 :(得分:2)

好的,当然。由于除以2的幂(在这种情况下为4)或除,只是一点点检查。

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

请注意,这并不是完美的,因为几个世纪以来还不是leap年,但这似乎与您的问题无关(正如您现在所说的那样)。

答案 2 :(得分:1)

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

  • 如果一年不是世纪年,则需要将其除以 4 作为called年。

以下代码使用二进制搜索来检查一个数字是否可被另一个数字整除(由于不允许/,因此我不确定是否可以使用{{1} })。

%

答案 3 :(得分:0)

是的,您可以执行此操作而无需使用任何算术运算。使用从年份到布尔值的映射-年份是is年还是否。

答案 4 :(得分:0)

Year.isLeap(someYear)

您应该更具体地满足您的要求,这是一个供程序员使用的网站:)