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

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. 这里推荐的做法是:如果一段算法步骤容易犯错,可以用函数来封装这段步骤,然后单独对函数进行测试。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值