欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python入门习题(66)——OpenJudge百练习题:黑色星期五

程序员文章站 2022-04-01 17:56:06
...

OpenJudge百练第4019号习题:黑色星期五

题目描述

来源
OpenJudge网站百练习题集-第4019号习题
要求
总时间限制: 1000ms 内存限制: 65536kB
描述
若某个月13号恰好是星期五,则这一天被称为黑色星期五。已知某年的一月一日是星期w,并且这一年是闰年,
求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1…7)
输入
输入有多组,每组一行且为一个整数w, 指该年的一月一日是星期w。(1<=w<=7)
输出
每组数据输出一行,从小到大输出具有黑色星期五的月份,月份与月份之间用空格隔开。若没有月份具有黑色星期五,则输出NULL
样例输入
1
样例输出
9 12

解题思路

  1. 根据1月1日是星期w,依次得出1月13日,2月13日,…, 12月13日是不是星期五,输出是星期五的月份。
  2. 如何判别m月13日是不是星期五呢?做法是:
    1). 求出m月13日离1月1日相差的天数。下面的代码中,调用函数day_sum(m, 13)可求出这一相差天数。
    2). 求出m月13日是星期几。下面的代码中,which_day函数实现这一功能。

参考答案

days_by_month = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30 ,31]
# print("sum(days) = ", sum(days_by_month))

#从星期day_start过了by天后,是星期几
def which_day(day_start, by):
    day = (day_start + by) % 7
    if day == 0:
        day = 7
    return day

# assert which_day(1, 7) == 1
# assert which_day(1, 6) == 7
# assert which_day(1, 1) == 2
# assert which_day(7, 1) == 1
# assert which_day(7, 7) == 7

#month月date日是闰年中的第几天
def day_sum(month, date=13):
    return sum(days_by_month[:month - 1]) + date

# assert day_sum(1, 1) == 1
# assert day_sum(1) == 13
# assert day_sum(2, 1) == 32
# assert day_sum(3, 1) == 61
# assert day_sum(12, 31) == 366

#一年中,黑色星期五的月份有哪些
#1月1日是星期w。
def months_black_friday(w):
    r_months = []
    for m in range(1, 13):
        day = which_day(w, day_sum(m, 13) - 1)  #m月13号是星期几
        if day == 5:
            r_months.append(m)
    if len(r_months) == 0:
        return "NULL"
    else:
        return ' '.join([str(month) for month in r_months])

import sys
for line in sys.stdin:  #在键盘上按Ctrl + D 或 Ctrl + Z表示输入结束
    w = int(line)
    print(months_black_friday(w))

测试用例

  1. 题目描述给出的测试用例中,输入只有一组。

  2. 输入有7组,分别覆盖星期一、二、…、日。
    样例输入
    1
    2
    3
    4
    5
    6
    7
    样例输出
    9 12
    6
    3 11
    2 8
    5
    10
    1 4 7
    检查样例输出,发现7组输出值凑满了12个月,彼此之间没有重复的月份。某个角度来讲表明代码有一定的正确性。为什么加一个“一定的”?因为人工求出7组输出,有些费时费力。

  3. 3月13日离1月1日差72天。因此,只要1月1日是星期3,3月13日就应该是黑色星期五。
    样例输入
    3
    样例输出
    3 11

  4. 2月13日离1月1日差43天。因此,只要1月1日是星期4, 2月13日就应该是黑色星期五。
    样例输入
    4
    样例输出
    2 8

小结

  1. 求month月date日是闰年中的第几天,容易出错。如果1到12月的整月天数不对,就会导致错误。上面给出的参考答案采取的对策是用day_sum函数实现求month月date日是闰年中的第几天的功能。这样,可以利用assert语句来测试求解步骤的正确性,就像第21到25行代码所示。
  2. 类似道理,函数which_day实现求“从星期day_start过了by天后,是星期几”的功能。第11到15行代码的作用是测试该函数的正确性。
  3. 这里推荐的做法是:如果一段算法步骤容易犯错,可以用函数来封装这段步骤,然后单独对函数进行测试。