PROB1025 开普勒星球历法
描述:
开普勒星的公转周期略长于地球,因此,开普勒星人将一个开普勒年分为 426 天。其中,前十二个月和地球完全一致,13 月和 14 月则分别为 30 和 31 天。
- 1月 31天
- 2月 28天(闰年29天)
- 3月 31天
- 4月 30天
- 5月 31天
- 6月 30天
- 7月 31天
- 8月 31天
- 9月 30天
- 10月 31天
- 11月 30天
- 12月 31天
- 13月 30天
- 14月 31天
每过几个开普勒年,就会有一个闰年,闰年的 2 月有 29 天。具体来说,如果一个开普勒年:
- 是整百年:要被 400 整除才是闰年,否则不是闰年;
- 是非整百年:只要被 4 整除就是闰年,否则不是闰年。
例如,1900 年是平年,2000 年是闰年,2020 年是闰年,2023 年是平年。
现在,开普勒星人想知道,从开普勒星今年的第一天开始,第 n 天是几月几日。
输入:
输入共一行,包含两个整数 Y 和 n,分别表示今年的年份和需要计算的跨越天数,题目保证 1234≤Y≤9999,1≤n≤426。
输出:
输出共一行,包含两个整数,分别表示第 n 天是几月几日。
样例输入:
2023 1
样例输出:
1 1
样例输入:
2024 426
样例输出:
14 30
样例输入:
2000 60
样例输出:
2 29
基于python实现的代码:
def is_leap_year(year):
if year % 100 == 0:
return year % 400 == 0
return year % 4 == 0
def kepler_calendar(year, n):
days_in_month = [31, 28 + is_leap_year(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 30, 31]
month = 1
while n > days_in_month[month - 1]:
n -= days_in_month[month - 1]
month += 1
return month, n
Y, n = map(int, input().split())
month, day = kepler_calendar(Y, n)
print(month, day)