040:万年历
描述
给定年月日,求星期几。已知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
#觉得写起来麻烦,就一直没写,今天休息,弄一下万年历
#有判断输入合法的地方,想了下,就是判断月小于1大于13,和日的问题
#边写边判断,先判断日小于1和大于28,30,31的问题,先用个r表示闰年,0是不闰,1是闰年
#是从程序的第5行开始写的,上面4行是后加的
#弄好Illegal之后,其它判断在else中
#日子数是年*365防数过大%7了,再加上每4闰年减100不闰,多减了,再加400再闰年
#起始想法是公元0年1月1日为星期几(不知道,但要找个从那开始的星期日),但我的days是从那时的周天开始算的
#题目给的日子不好用,还得减==,就用从0年开始的周日,最后倒推减几
#倒数第三行,减几就是调的数,用题目中给的年月日,输入后看是周几,再调的
week=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
monday=[0,31,28,31,30,31,30,31,31,30,31,30,31]
n=int(input())
for m in range(n):
s=input().split()
year=int(s[0])
mon=int(s[1])
day=int(s[2])
days=0
r=int(year%4==0 and year%100!=0 or year%400==0)
if mon==2 and (day<1 or day>28+r) or (mon in [1,3,5,7,8,10,12]) and (day<1 or day>31)\
or (mon in [4,6,9,11]) and (day<1 or day>30) or mon>12 or mon<1:
print("Illegal")
else:
days=year*365%7+(year//4+year//400-year//100)%7
for i in range(1,mon):
days+=monday[i]
if mon<3:#因为0年就是闰年了,如果输入年是闰年,上面days的值如没到3月,就多加了一天
days-=r#是闰年,就是1,不是闰年就是0,和平年没关系
days+=day-1
t=days%7
print(week[t])