检查闰年 - 不使用除法运算
Check Leap Year - without using division operation
如何在不使用除法运算的情况下检查给定年份是否为闰年
Java 中的一些库方法。是否可以使用按位运算符进行检查?
PS:几个世纪以来都不需要验证
这里有一些不使用模函数识别闰年的方法。
首先,我们假设(或测试)年份在 1901 - 2099
.
范围内
以二进制数表示的闰年将 00
作为
最后两位数。所以:
今年是闰年if year & (not 4) == 0
如果您有一个函数可以将实数截断为
整数那么这有效:
x = trunc(year / 4)
闰年if x * 4 == year
如果你有移位(不是循环移位)运算符,我敢肯定
Verilog 则:
x = year >> 2
今年是闰年if (x << 2) == year
如果关于范围 1901 - 2099
的假设是错误的,那么您将需要一些额外的逻辑来消除 1900, 1800, 1700 and 2100, 2200, 2300 and so on
。
嗯,当然。由于除法或 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
}
请注意这并不完美,因为有些世纪不是闰年,但这似乎与您的问题无关(如您现在所述)。
是的,您可以在不使用任何算术运算的情况下完成。使用从年份映射到布尔值的地图 - 无论年份是否为闰年。
如果年份是世纪年,意思是可以被100整除,那么需要被400[=27=整除] 被称为 闰年 .
如果年份不是世纪年,则需要被4整除才能称为闰年
下面的代码使用 二进制搜索 来检查一个数字是否可以被另一个数字整除(因为 /
是不允许的,我不确定你是否可以尽管使用 %
)。
public static boolean isLeapYear(int year){
return isDivisible(1,year,100,year) ? isDivisible(1,year,400,year) : isDivisible(1,year,4,year);
}
private static boolean isDivisible(int low,int high,int divisor,int dividend){
int mid = 0;
while(low <= high){
mid = low + ((high - low) >> 1);
int result = divisor * mid;
if(result == dividend) return true;
else if(result > dividend) high = mid - 1;
else low = mid + 1;
}
return false;
}
Year.isLeap(someYear)
您应该更具体地说明您的要求,这是一个面向程序员的网站:)
如何在不使用除法运算的情况下检查给定年份是否为闰年 Java 中的一些库方法。是否可以使用按位运算符进行检查?
PS:几个世纪以来都不需要验证
这里有一些不使用模函数识别闰年的方法。
首先,我们假设(或测试)年份在 1901 - 2099
.
以二进制数表示的闰年将
00
作为 最后两位数。所以:今年是闰年
if year & (not 4) == 0
如果您有一个函数可以将实数截断为 整数那么这有效:
x = trunc(year / 4)
闰年
if x * 4 == year
如果你有移位(不是循环移位)运算符,我敢肯定 Verilog 则:
x = year >> 2
今年是闰年
if (x << 2) == year
如果关于范围 1901 - 2099
的假设是错误的,那么您将需要一些额外的逻辑来消除 1900, 1800, 1700 and 2100, 2200, 2300 and so on
。
嗯,当然。由于除法或 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
}
请注意这并不完美,因为有些世纪不是闰年,但这似乎与您的问题无关(如您现在所述)。
是的,您可以在不使用任何算术运算的情况下完成。使用从年份映射到布尔值的地图 - 无论年份是否为闰年。
如果年份是世纪年,意思是可以被100整除,那么需要被400[=27=整除] 被称为 闰年 .
如果年份不是世纪年,则需要被4整除才能称为闰年
下面的代码使用 二进制搜索 来检查一个数字是否可以被另一个数字整除(因为 /
是不允许的,我不确定你是否可以尽管使用 %
)。
public static boolean isLeapYear(int year){
return isDivisible(1,year,100,year) ? isDivisible(1,year,400,year) : isDivisible(1,year,4,year);
}
private static boolean isDivisible(int low,int high,int divisor,int dividend){
int mid = 0;
while(low <= high){
mid = low + ((high - low) >> 1);
int result = divisor * mid;
if(result == dividend) return true;
else if(result > dividend) high = mid - 1;
else low = mid + 1;
}
return false;
}
Year.isLeap(someYear)
您应该更具体地说明您的要求,这是一个面向程序员的网站:)