第八章 复活节日 Date of Easter
对西方的节日没有多少了解,这里就直接给出书中的算法吧~
1. 格里历复活节算法
\begin{array}{l|ccc}
被除数 & 除数 & 商 & 余数 \\
\hline
年份y & 19 & - & a \\
年份y & 100 & b & c \\
b & 4 & d & e \\
b+8 & 25 & f & - \\
b-f+1 & 3 & g & - \\
19a+b-d-g+15 & 30 & - & h \\
c & 4 & i & k \\
32+2e+2i-h-k & 7 & - & l \\
a+11h+22l & 451 & m & - \\
h+l-7m+114 & 31 & n & p \\
\end{array}
得 $$n = 月份, \ p+1 = 日期$$
// Gregorian returns month and day of Easter in the Gregorian calendar.
// 格里历复活节日算法
func Gregorian(y int) (m, d int) {
a := y % 19
b, c := y/100, y%100
d, e := b/4, b%4
f := (b + 8) / 25
g := (b - f + 1) / 3
h := (19*a + b - d - g + 15) % 30
i, k := c/4, c%4
l := (32 + 2*e + 2*i - h - k) % 7
m = (a + 11*h + 22*l) / 451
n := h + l - 7*m + 114
n, p := n/31, n%31
return n, p + 1
}
2. 儒略历复活节算法
\begin{array}{l|ccc}
被除数 & 除数 & 商 & 余数 \\
\hline
年份y & 4 & - & a \\
年份y & 7 & - & b \\
年份y & 19 & - & c \\
19c+15 & 30 & - & d \\
2a+4b-d+34 & 7 & - & e \\
d+e+114 & 31 & f & g \\
\end{array}
得 $$f = 月份, \ g+1 = 日期$$
// Julian returns month and day of Easter in the Julian calendar.
// 儒略历复活节日算法
func Julian(y int) (m, d int) {
a := y % 4
b := y % 7
c := y % 19
d = (19*c + 15) % 30
e := (2*a + 4*b - d + 34) % 7
f := d + e + 114
f, g := f/31, f%31
return f, g + 1
}