Python经常遇到的笔试题之三天打鱼两天晒网:

本文介绍如何使用Python解决一个有趣的日期问题:从1990年1月1日起,按照'三天打鱼两天晒网'的规律,判断任意日期是打鱼还是晒网。通过计算总天数、考虑闰年和每月天数,最后对5取余确定状态。

问题概述:中国有句俗语叫“三天打鱼两天晒网”某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。

整体思路如下:

1.计算从1990年1月1日开始至指定日期共有多少天;

2.由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5取除;

3.根据余数判断他是在“打鱼”还是在“晒网”;若余数为1,2,3,则他是在“打鱼”;否则是在“晒网”

第一步:

首先,我们要判断用户输入的日期是否正确,在程序中规定日期的格式YYYYMMDD(年月日),并且只能为8位整数。采用INT(输入(XXX)即输入只能为整数,输入字符串时会产生异常,会提醒你输入整数。通过列表,将输入的数字转为数组,方便之后提取年月日,也方便求输入的长度;通过LEN(日期)判断输入是否为8位,如果输入的不够八位数或者超过时也会产生异常,当输入正确的日期后,首先会数组提取日期,即数组0-3为年,4-5位月份,6-7为日。首先根据年份判断该日期是否在2010年之后,若不是则会产生异常。

第二步:

获取到正确的输入日期信息以后就要来计算距离1990年1月1日的总天数了通过自定义函数来判断是否是闰年。

第三步:

接下来算用户输入日期这一年已经过了多少天,如果是闰年2会有29天,其他情况1、3、5、7、8、10、12月有31天,4、6、9、11有30天。所以首先要判断每个月有多少天然后将这些月份的总天数相加,最后加上用户输入的“天”。

第四步:

最后将这两部分相加就是用户输入的日期距离1990年1月1日的总天数,然后将其对5取余,根据余数判断为“打鱼”还是“晒网”。

代码

try:
    Date = int(input('请输入日期(请以yyyymmdd输入):'))
    date = list(str(Date))

    try:
        if len(date) != 8:
            print("输入日期有误!")
        global year
        year = date[0] + date[1] + date[2] + date[3]
        year = int(year)
        month = date[4] + date[5]
        month = int(month)
        day = date[6] + date[7]
        day = int(day)

        if year < 1990:
            print("请输入正确的日期!")

        # 判断是不是闰年
        def runYear(year):
            if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
                return True
            else:
                return False

        # 判断每月有几天
        def getDays(year, month):
            days = 0
            if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12:
                days = 31
            elif month == 4 or month == 6 or month == 9 or month == 11:
                days = 30
            elif month == 2:
                if runYear(year):
                    days = 29
                else:
                    days = 28
            return days

        # 计算该日期本年总天数
        def thisYearDays(year, month, day):
            sum = 0
            while month > 0:
            	month -= 1
                monthDay = getDays(year, month)
                sum += monthDay
            return sum + day

        # 计算距离输入日期的总天数
        def allDays(year, month, day):
            sum = 0
            i = 1990
            while i < year:
                if runYear(i):
                    sum += 366
                else:
                    sum += 365
                i += 1
            s = thisYearDays(year, month, day)
            sum += s
            return sum


        # 判断是捕鱼还是晒网
        def judge(days):
            x =days % 5
            if x >= 1 and x <= 3:  # 当余数为1/2/3时为打鱼,余数为0/4时候为晒网
                print("今天打鱼")
            else:
                print("今天晒网")

        sum = allDays(year, month, day)
        judge(sum)

    except IndexError:
        print("请输入八位整数")
except ValueError:
    print("请输入整数!")

结果:

请输入日期(请以yyyymmdd输入):19900203
今天打鱼
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值