Tomohiko Sakamoto的算法如何运作?需要详细说明

时间:2015-01-18 23:54:30

标签: c algorithm math dayofweek

以下函数代表来自维基百科页面的Sakamoto算法 - http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week

int dow(int y, int m, int d) {
    /* 1 <= m <= 12,  y > 1752 (in the U.K.) */
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;  
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

我不明白算法是如何工作的?特别是,t []数组。

2 个答案:

答案 0 :(得分:2)

解释非常简单:

http://en.wikipedia.org/wiki/Leap_year

if (year is not divisible by 4) then (it is a common year)
else
if (year is not divisible by 100) then (it is a leap year)
else
if (year is not divisible by 400) then (it is a common year)
else (it is a leap year)

t []是一个每月有“#/天”偏移量的表格。

答案 1 :(得分:2)

比较的结果是int包含0或1.所以这一行

y -= m < 3;  

表示“如果月份是1月或2月,则今年的闰日尚未发生”。