閏年判斷就是 能被 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 閱讀(126)
評論(0) 編輯 收藏 引用