试题编号: 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
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)
题目描述中给出的第一组测试用例覆盖了平年,在3月的情形。
题目描述中给出的第二组测试用例覆盖了闰年,在2月的情形。
闰年,2月之后的情形。在题目描述中给出的第二组测试用例的基础上构造。
样例输入
2000
61
样例输出
3
1
闰年,2月29日的情形。在题目描述中给出的第二组测试用例的基础上构造。
样例输入
2000
60
样例输出
2
29
平年,2月28日的情形。参照题目描述中给出的第二组测试用例构造。
样例输入
2015
59
样例输出
2
28
1月1号的情形。
样例输入
2015
1
样例输出
1
1
上面的测试用例已经覆盖日期在1,2,3月的情形。要构造分别覆盖日期在4,5,6,…12月的测试用例吗?答案是,要。为什么?因为有可能把这些月份的总天数写错。在软件开发中,要有“怀疑一切”的做法。在认证考试期间,现场构造测试用例的开销比较大,可以折中处理。做法是,仔细检查12个月份的总天数,再检查一遍。加上下面两组测试用例,应该心里有底了。
闰年,输入的天数是366天的情形。
样例输入
2000
366
样例输出
12
31
平年,输入的天数是365天的情形。
样例输入
2015
365
样例输出
12
31
1900年,不是闰年的情形。这一组测试用例用来验证计算闰年的代码的正确性。1900年能被100整除,但不能被400整除,不是闰年。
样例输入
1900
365
样例输出
12
31
2012年,是闰年的情形。这一组测试用例用来验证计算闰年的代码的正确性。2012年能被4整除,不能被100整除。
样例输入
2012
365
样例输出
12
30
2000年能被400整除,是闰年。前面的测试用例已经覆盖了。