给出年份 y 和一年中的第 d天,算出第 d天是几月几号。
输入格式
输入包含多组测试数据。
每组数据占一行,包含两个整数 y和 d。
输出格式
每组数据输出一行一个结果,格式为 yyyy-mm-dd
。
数据范围
输入最多包含 100100 组数据,
1≤y≤3000
1≤d≤366,
数据保证合法。
输入样例:
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
输出样例:
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
难度:简单 |
时/空限制:1s / 64MB |
总通过数:2172 |
总尝试数:4377 |
来源: |
算法标签:枚举 模拟 日期问题 |
#include <bits/stdc++.h>
using namespace std;
//平年每个月份的天数
const int months[] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
//判断是否是闰年
int is_leap(int year)
{
if(year % 400 == 0 || (year % 4 == 0 && year % 100)) return 1;
return 0;
}
//获得y年第m月的天数
int get_days(int y, int m)
{
if(m == 2) return months[m] + is_leap(y);
return months[m];
}
int main()
{
int y, m, d, days;
while(cin >> y >> days)
{
m = 1, d = 0;
while(days -- )
{
d ++;
if(d > get_days(y, m)) //如果d大于本月的天数,将变成下一月的1号
{
d = 1, m ++;
if(m > 12) m = 1, y ++; //如果月份大于12,将变成下一年的1月
}
}
printf("%04d-%02d-%02d\n", y, m, d);
}
return 0;
}