题目描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出
可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
样例输入
2013 60 2012 300 2011 350 2000 211
样例输出
2013-03-01 2012-10-26 2011-12-16 2000-07-29
个人思路:首先这个问题是吧年份中的天数转换为当年对应的日期,首先想到区分闰年和平年,分别作出处理(其实大同小异暂未想到统一处理方法),然后再划分月份,划分月份时本打算计算月份的天数区间划分月份(人工计算),感觉太麻烦写得好多if esle,后来用数组尝试,数组保留前n(0 -- 12)个月份的天数 ,遍历计算找到天数和月份的规律,发现不小于当前年份天数n的第一个数组的下标即为当前月份,然后再计算本月天数(即当前年份天数n - 前几个月的天数)。
最后是输出格式的处理题目要求yyyy-mm-dd 年月日不足位数用0在前边补齐即
cout << setw(4) << setfill('0') << y << "-"; //(头文件为 #include<iomanip>)
下面是实现代码:
#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;
int noLeap[13] = {0, 31, 59, 90,120,151,181,212,243,273,304,334,365};
int leapDay[13] = {0, 31, 60, 91,121,152,182,213,244,274,305,335,366};
int main()
{
int y, n;
while(scanf("%d%d",&y,&n) != EOF)
{
int m, d;
//闰年
if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
{
for(int i = 0; i < 13; i++)
{
if(leapDay[i] >= n)
{
m = i; //利用数组下标和月份差一
d = n - leapDay[i - 1];
break;
}
}
}
//平年
else
{
for(int j = 0; j < 13; j++)
{
if(noLeap[j] >= n)
{
m = j;
d = n - noLeap[j - 1];
break;
}
}
}
cout << setw(4) << setfill('0') << y << "-"; //4位数字不够前边0补齐
cout << setw(2) << setfill('0') << m << "-";
cout << setw(2) << setfill('0') << d << endl;
}
return 0;
}