Python入门习题(66)——OpenJudge百练习题:黑色星期五
程序员文章站
2022-04-01 17:56:06
...
题目描述
来源
OpenJudge网站 – 百练习题集-第4019号习题
要求
总时间限制: 1000ms 内存限制: 65536kB
描述
若某个月13号恰好是星期五,则这一天被称为黑色星期五。已知某年的一月一日是星期w,并且这一年是闰年,
求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1…7)
输入
输入有多组,每组一行且为一个整数w, 指该年的一月一日是星期w。(1<=w<=7)
输出
每组数据输出一行,从小到大输出具有黑色星期五的月份,月份与月份之间用空格隔开。若没有月份具有黑色星期五,则输出NULL
样例输入
1
样例输出
9 12
解题思路
- 根据1月1日是星期w,依次得出1月13日,2月13日,…, 12月13日是不是星期五,输出是星期五的月份。
- 如何判别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))
测试用例
-
题目描述给出的测试用例中,输入只有一组。
-
输入有7组,分别覆盖星期一、二、…、日。
样例输入
1
2
3
4
5
6
7
样例输出
9 12
6
3 11
2 8
5
10
1 4 7
检查样例输出,发现7组输出值凑满了12个月,彼此之间没有重复的月份。某个角度来讲表明代码有一定的正确性。为什么加一个“一定的”?因为人工求出7组输出,有些费时费力。 -
3月13日离1月1日差72天。因此,只要1月1日是星期3,3月13日就应该是黑色星期五。
样例输入
3
样例输出
3 11 -
2月13日离1月1日差43天。因此,只要1月1日是星期4, 2月13日就应该是黑色星期五。
样例输入
4
样例输出
2 8
小结
- 求month月date日是闰年中的第几天,容易出错。如果1到12月的整月天数不对,就会导致错误。上面给出的参考答案采取的对策是用day_sum函数实现求month月date日是闰年中的第几天的功能。这样,可以利用assert语句来测试求解步骤的正确性,就像第21到25行代码所示。
- 类似道理,函数which_day实现求“从星期day_start过了by天后,是星期几”的功能。第11到15行代码的作用是测试该函数的正确性。
- 这里推荐的做法是:如果一段算法步骤容易犯错,可以用函数来封装这段步骤,然后单独对函数进行测试。
下一篇: 79-多边形的面积-计算几何
推荐阅读
-
Python入门习题(81)——OpenJudge百练习题:报站
-
Python入门习题(87)——OpenJudge百练习题:判断游戏胜者
-
Python入门习题(62)——OpenJudge百练习题:方便记忆的电话号码
-
Python入门习题(63)——OpenJudge百练习题:DNA排序
-
Python入门习题(64)——OpenJudge百练习题:最长单词
-
Python入门习题(66)——OpenJudge百练习题:黑色星期五
-
Python入门习题(72)——OpenJudge百练习题:判断是否可以构成等差数列
-
Python入门习题(76)——OpenJudge百练习题:判断多个点是否在同一直线