闰年判断就是 能被 400 整除的,后者能被 4 整除且不能被 100 整除的年份。
即
1 int isLeapYear(int y)
2 {
3 if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
4 {
5 return 1;
6 }
7 else
8 {
9 return 0;
10 }
11 }
但是这里有个细节需要注意就是,(y % 4 == 0 && y % 100 != 0) || y % 400 == 0 这个表达式中的三个子表达式的顺序怎样调整。
y % 4 == 0
y % 100 != 0
y % 400 == 0
这里有 4 中组合:
·(y % 4 == 0 && y % 100 != 0) || y % 400 == 0
·(y % 100 != 0 && y % 4 == 0) || y % 400 == 0
·y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)
·y % 400 == 0 || (y % 100 != 0 && y % 4 == 0)
我们首先确定 y % 400 是不是应该在最前,对于一般的年份很少有能被 400 整除的年份,其概率为 1 / 400,所以 y % 400 == 0 基本都为假,这样就必须还要判断后面的表达式,所以应该将 y % 400 放在后面。
然后,判断 y % 100 != 0 是否应该在 y % 4 == 0 之前,y % 100 != 0 为真的概率很大及为 99 / 100,而 y % 4 == 0 为真的概率为 1 / 4,也就是说 y % 4 为假的概率更大。根据 && 操作符的性质,当前面一个为假时其就不用判断后面的表达式是否为真假了。所以应该把 y % 4 == 0 放在 y % 100 != 0 前面效率更好。
即判断闰年的表达式顺序应该为这样是,效率最高:
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0
posted on 2011-04-22 00:17
unixfy 阅读(122)
评论(0) 编辑 收藏 引用