AcWing 3607. 打印日期
题目
给出年份 和一年中的第 天,算出第 天是几月几号。
输入格式
输入包含多组测试数据。
每组数据占一行,包含两个整数 和 。
输出格式
每组数据输出一行一个结果,格式为yyyy-mm-dd。
数据范围
输入最多包含 组数据,
,
,
数据保证合法。
输入样例:
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
思路
遇到有关日期的问题,先将如下三个函数写上,基本即可解决全部问题。
1. 求每个月的天数的函数
// 二月先记为平年的情况下,每月的天数。
const int months[13] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
2. 判断闰年的函数
// 闰年返回1,平年返回0
int is_leap(int year) {
if (year % 4 == 0 && year % 100 || year % 400 == 0)
return 1;
return 0;
}
3. 求 年 月有多少天的函数
// 返回y年m月有多少天
int get_days(int y, int m) {
if (m == 2) return months[m] + is_leap(y);
return months[m];
}
题解
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int months[13] = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
int is_leap(int year) // 闰年返回1,平年返回0
{
if (year % 4 == 0 && year % 100 || year % 400 == 0)
return 1;
return 0;
}
int get_days(int y, int m) // y年m月有多少天
{
if (m == 2) return months[m] + is_leap(y);
return months[m];
}
int main()
{
int y, s;
while (cin >> y >> s)
{
int m = 1, d = 1;
s -- ;
while (s -- )
{
if ( ++ d > get_days(y, m))
{
d = 1;
if ( ++ m > 12)
{
m = 1;
y ++ ;
}
}
}
printf("%04d-%02d-%02d\n", y, m, d);
}
return 0;
}