使用Python程序设计:039:万年历

编程挑战:万年历日期转星期,
该编程问题要求编写一个函数,根据给定的年月日计算对应的星期。程序需处理公元前和公元后的日期,考虑闰年的规则,并检查输入的日期是否合法。非法日期应返回Illegal。示例输入和输出展示了不同合法和非法情况的处理。

039:万年历

总时间限制: 

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
def Rl(y,m,d):
    days = 0
    dates = 0
    years = 0
    days_old = 15
    I ='Illegal'
    month1 = [31,28,31,30,31,30,31,31,30,31,30,31]
    month2 = [31,29,31,30,31,30,31,31,30,31,30,31]
    weekdays = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday","Saturday"]
    for i in range(10):
        days_old += month2[i]
    if (y%4 == 0 and y%100!=0) or y%400 == 0:
        if m in [1,3,5,7,8,10,12]:
            if d > 31 or d <1 :
                print(I)
                return
        elif m == 2:
            if d < 1 or d > 29:
                print(I)
                return
        elif m in [4,6,9,11]:
            if d<1 or d >30:
                print(I)
                return
        else:
            print(I)
            return
    else:
        if m in [1,3,5,7,8,10,12]:
            if d > 31 or d <1 :
                print(I)
                return
        elif m == 2:
            if d < 1 or d > 28:
                print(I)
                return
        elif m in [4,6,9,11]:
            if d<1 or d >30:
                print(I)
                return
        else:
            print(I)
            return
    #输入年份大于2020年11月
    if y> 2020 or (y == 2020 and m == 11 and d >= 15):
        for i in range(2020,y):
            if (i %4==0 and i%100!= 0) or i%400 ==0:
                years += 366
            else:
                years +=365
        if (y%4 == 0 and y%100 != 0) or y%400 == 0:
            for i in range(m-1):
                days += month2[i]
        else:
            for i in range(m-1):
                days += month1[i]
        dates = years + days + d - days_old
        print(weekdays[dates%7])
    #2020年11月之前
    elif (y == 2020 and m < 11) or ( y == 2020 and m == 11 and d<15):
        for i in range(m-1):
            days += month2[i]
        dates = days_old - days -d
        print(weekdays[(7-dates%7)%7])
    #输入时间早于2020年
    else:
        for i in range(y+1,2020):
            if (i %4 == 0 and i%100 != 0) or i%400 == 0:
                years += 366
            else:
                years += 365
        if (y%4 ==0 and y%100 != 0) or y%400 ==0:
            for i in range(m-1,12):
                days += month2[i]
        else:
            for i in range(m-1,12):
                days += month1[i]
        dates = years + days - d + days_old
        print(weekdays[(7-dates%7)%7])
a = int(input())
c =[]
for i in range(a):
    b = input().split()
    c.append(b)
for i in range(len(c)):
    a1 ,a2 , a3 = int(c[i][0]) ,int(c[i][1]) ,int(c[i][2])
    Rl(a1,a2,a3)

 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值