总时间限制: 1000ms 内存限制: 65536kB
描述
给定年月日,求星期几。已知2020年11月18日是星期三。另外,本题有公元0年,这个和真实的纪年不一样
输入
第一行是n(n <=30),表示有n组数据
接下来n行,每行是一组数据。
每行三个整数y,m,d,分别代表年,月,日。(-1000000<=y<=1000000)
若今年是2017年,则往前就是2016年,2015年…一直数到2年,1年,再往前就是0年,-1年,-2年…
输出
对每组数据,输出星期几,星期几分别用
“Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”, “Friday”,“Saturday” 表示
如果月份和日期不合法,输出"Illegal"
样例输入:
6
2017 2 29
2017 13 2
0 1 1
-2 3 4
2017 10 18
2015 12 31
样例输出:
Illegal
Illegal
Saturday
Wednesday
Wednesday
Thursday
来源
Guo Wei
我的思考:
郭炜老师给了思路,修改他讲解的例题代码。原本想用数学的方法后面想想还是算了……枚举好理解点,特别在往后逆推天数。
求年份小于2012的星期几,在好好听了老师讲的思路后,用逆向的思维去求解即可,比如求 0 1 1,那我们就求从0 年 到 2012 年有多少天,然后 用days%7便得到了 还剩下下的余数,同样是用逆向思维,比如余1,那就是周六,也就是7-days%7,但这还不够,因为这个公式在days%7==0的情况下,得到的是7,可我们的xq列表里Sunday排0,所以继续取余,就变成了 (7-days%7)%7,这样就可以得到正确的下标。
其实一开始我觉得难的地方是0年怎么算,看了提示后,我意识到例题里的判断是否闰年的方法应该是可以继续沿用的,然后重点在year<2012时逆推天数。
代码如下:
第一次没成功,修改了下,第二次就ac了。这道题算是个奇葩,代码长度和前面比起来突然增加……
xq=["Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday"]
n=int(input())
for n1 in range(n):
monthDays = [-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = 0
lst = input().split()
year, month, date = int(lst[0]), int(lst[1]), int(lst[2])
# 该模块判断是否合法
buhefa=0
if month>12 or month<1:
buhefa=1
else:
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
if (date < 1 or date > monthDays[month]) and month != 2:
buhefa = 1
if month == 2 and date > 29:
buhefa = 1
else:
if date < 1 or date > monthDays[month]:
buhefa = 1
# 该模块判断是否合法
if buhefa: # 不合法
print("Illegal")
else: # 合法
if year >= 2012:
for y in range(2012, year): # 先累加过掉的整年的天数
if y % 4 == 0 and y % 100 != 0 or y % 400 == 0: # 闰年
days += 366
else:
days += 365
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
monthDays[2] = 29
for i in range(1, month): # 再累加year那年过掉的整月的天数
days += monthDays[i]
days += date # 累加year年month那个月的天数
days -= 22 # 2012年1月22日是星期天。扣掉2012年的前22天
print(xq[days % 7]) # 星期天算一周的第0天
else:
for y in range(year, 2012):
if y % 4 == 0 and y % 100 != 0 or y % 400 == 0: # 闰年
days += 366
else:
days += 365
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
monthDays[2] = 29
for i in range(1, month): # 减去多余的
days -= monthDays[i]
days -= date # 同上需要减去多余的
days += 22 # 加上需要的
print(xq[(7 - days % 7) % 7]) #