Python入门习题(33)——CCF CSP认证考试真题:日期计算

CCF CSP认证考试真题:日期计算

问题描述

试题编号: 201509-2
试题名称: 日期计算
时间限制: 1.0s
内存限制: 256.0MB

问题描述
  给定一个年份y和一个整数d,问这一年的第d天是几月几日?
  注意闰年的2月有29天。满足下面条件之一的是闰年:
  1) 年份是4的整数倍,而且不是100的整数倍;
  2) 年份是400的整数倍。
输入格式
  输入的第一行包含一个整数y,表示年份,年份在1900到2015之间(包含1900和2015)。
  输入的第二行包含一个整数d,d在1至365之间。
输出格式
  输出两行,每行一个整数,分别表示答案的月份和日期。
样例输入
2015
80
样例输出
3
21
样例输入
2000
40
样例输出
2
9

解题思路

  1. 天数减去一月总天数,减去二月总天数,减去三月总天数,…,直至剩余天数小于下一个月总天数,那么就得出几月几号。
  2. 用一个数组(即Python列表)存储12个月份的天数,就可以用循环来实现上一条的计算过程。
  3. 一点细节是,闰年的话,二月总天数是29天;平年的话,是28天。

参考答案

def is_runnian(year):
    return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0

year = int(input())
days = int(input())
#用列表存储12个月份的天数
days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if is_runnian(year):
    days_per_month[1] = 29;
# 天数减去一月总天数,减去二月总天数,减去三月总天数,...,直至剩余天数小于下一个月总天数,那么就得出几月几号。
d = days
for m in range(12):
    if d <= days_per_month[m]:
        break
    else:
        d -= days_per_month[m]

print(m + 1)
print(d)

测试用例

  1. 题目描述中给出的第一组测试用例覆盖了平年,在3月的情形。

  2. 题目描述中给出的第二组测试用例覆盖了闰年,在2月的情形。

  3. 闰年,2月之后的情形。在题目描述中给出的第二组测试用例的基础上构造。
    样例输入
    2000
    61
    样例输出
    3
    1

  4. 闰年,2月29日的情形。在题目描述中给出的第二组测试用例的基础上构造。
    样例输入
    2000
    60
    样例输出
    2
    29

  5. 平年,2月28日的情形。参照题目描述中给出的第二组测试用例构造。
    样例输入
    2015
    59
    样例输出
    2
    28

  6. 1月1号的情形。
    样例输入
    2015
    1
    样例输出
    1
    1

  7. 上面的测试用例已经覆盖日期在1,2,3月的情形。要构造分别覆盖日期在4,5,6,…12月的测试用例吗?答案是,要。为什么?因为有可能把这些月份的总天数写错。在软件开发中,要有“怀疑一切”的做法。在认证考试期间,现场构造测试用例的开销比较大,可以折中处理。做法是,仔细检查12个月份的总天数,再检查一遍。加上下面两组测试用例,应该心里有底了。

  8. 闰年,输入的天数是366天的情形。
    样例输入
    2000
    366
    样例输出
    12
    31

  9. 平年,输入的天数是365天的情形。
    样例输入
    2015
    365
    样例输出
    12
    31

  10. 1900年,不是闰年的情形。这一组测试用例用来验证计算闰年的代码的正确性。1900年能被100整除,但不能被400整除,不是闰年。
    样例输入
    1900
    365
    样例输出
    12
    31

  11. 2012年,是闰年的情形。这一组测试用例用来验证计算闰年的代码的正确性。2012年能被4整除,不能被100整除。
    样例输入
    2012
    365
    样例输出
    12
    30

  12. 2000年能被400整除,是闰年。前面的测试用例已经覆盖了。

小结

  1. 不考虑编程实现的话,给你一个天数,请你计算它是一年中几月几号,你采用的解题思路跟上面“解题思路”一节给出的步骤估计差不多。程序设计无非是用编程语言实现了人的解题思路。这个解题思路就是算法。
  2. 本文给出的测试用例有10个,这是必要的。事实上,在实际的工程开发中,有必要构造分别覆盖日期在4,5,6,…12月的测试用例。要记住,不要拍胸脯打包票,要用测试代码来验证(“打包票”)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值