【每日一题】一周中的第几天(基姆拉尔森公式的应用)
相关文章:
1、题目来源
Leetcode:
一周中的第几天
2、题目描述
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。输入为三个整数:day、month 和 year,分别表示日、月、年。
您返回的结果必须是这几个值中的一个
{“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}
。
提示:
给出的日期一定在1971到2100年之间的有效日期。
3、示例
示例1:
输入:day = 31, month = 8, year = 2019
输出:“Saturday”
示例2:
输入:day = 18, month = 7, year = 1999
输出:“Sunday”
示例3:
输入:day = 15, month = 8, year = 1993
输出:“Sunday”
4、解题思路
对于问题一常用的两个公式是基姆拉尔森公式和蔡勒公式,都是计算星期数的。
●
基姆拉尔森公式:
w
e
a
k
=
(
d
a
y
+
2
×
m
o
n
t
h
+
3
×
(
m
o
n
t
h
+
1
)
5
+
y
e
a
r
+
y
e
a
r
4
−
y
e
a
r
100
+
y
e
a
r
100
+
1
)
m
o
d
7
weak=(day + 2\times month + \frac{3\times(month+1)}{5} + year + \frac{year}{4} – \frac{year}{100} + \frac{year}{100} +1) mod 7
w
e
a
k
=
(
d
a
y
+
2
×
m
o
n
t
h
+
5
3
×
(
m
o
n
t
h
+
1
)
+
y
e
a
r
+
4
y
e
a
r
−
1
0
0
y
e
a
r
+
1
0
0
y
e
a
r
+
1
)
m
o
d
7
●
蔡勒公式:
w
e
a
k
=
(
y
e
a
r
+
[
y
e
a
r
4
]
+
[
c
4
]
−
2
c
+
[
13
×
(
m
o
n
t
h
+
1
)
5
]
+
d
a
y
−
1
)
m
o
d
7
weak=(year + [\frac{year}{4}] + [\frac{c}{4}] -2c + [\frac{13\times(month+1)}{5}] + day -1) mod 7
w
e
a
k
=
(
y
e
a
r
+
[
4
y
e
a
r
]
+
[
4
c
]
−
2
c
+
[
5
1
3
×
(
m
o
n
t
h
+
1
)
]
+
d
a
y
−
1
)
m
o
d
7
其中:
其中:
year, month, day, weak分别表示年(后两位)、月、日、星期,c 表示为世纪数减一,即year/100(前两位)
注意:
- 星期是从星期天开始计的(0-Sunday;1-Monday;2-Tuesday;3-Wednesday;4-Thursday;5-Friday;6-Saturday)
- 1月和2月要转成上一年的13月和14月:比如2020.01要转成2019.13
5、代码展示
(1)基姆拉尔森公式
string dayOfTheWeek(int day, int month, int year)
{
if (month==1||month==2)
{
month+=12;
year--;
}
int week = (day + 2*month + 3 * (month+1)/5 + year + year/4 - year/100 + year/400 + 1) % 7;//基姆拉尔森公式
string str[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
return str[week];
}
(2)蔡勒公式
string dayOfTheWeek(int day, int month, int year)
{
if(month == 1 || month == 2)
{
month += 12;
year--;
}
int c = year / 100;
int y = year % 100;
int m = month;
int d = day;
int W = c/4-2*c+y+y/4+26*(m+1)/10+d-1;//蔡勒公式
while(W<0) { W+=7;}
W=W%7;
string str[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
return str[W];
}
};
6、补充说明
最后关于
蔡勒公式
,还需要做两点补充说明:
(1)
在计算机编程中,W的计算结果有可能是
负数
。我们需要注意,数学中的求余运算和编程中的求余运算不是完全相同的,数学上余数不能是负数,而编程中余数可以是负数。
因此,在计算机中 W 是负数时,我们需要进行修正。修正方法十分简单:让 W 加上一个足够大的 7 的整数倍,使其成为正数,得到的结果再对 7 取余即可。比如
−
15
-15
−
1
5
,我可以让其加上
7
×
10
7\times10
7
×
1
0
,
−
15
+
70
=
55
-15+70=55
−
1
5
+
7
0
=
5
5
,再除以 7 余 6,通过余数可知这一天是星期六。
(2)
蔡勒公式只适用于格里高利历(也就是现在的公历)。有关历法的问题,大家有兴趣可以深刻研究。