040 万年历

总时间限制: 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]) # 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值