题目:
给定一个日期,输出这个日期是该年的第几天。
Input
输入数据有多组,每组占一行,数据格式为YYYY/MM/DD组成,具体参见sample input ,另外,可以向你确保所有的输入数据是合法的。
Output
对于每组输入数据,输出一行,表示该日期是该年的第几天。
Sample Input
1985/1/20
2006/3/12
Sample Output
20
71
该题目难点在于:
1.输入格式问题,可以采用scanf进行一定格式的输入。
scanf("%d/%d/%d",&y,&m,&d)
2.while循环导致的时间超限问题,(这是我掉的坑),在while中如果只是while(scanf(“%d/%d/%d”,&y,&m,&d)),放在oj上提交会出现Time Limit Exceeded错误,经过借鉴他人经验,发现如果这样scanf(“%d/%d/%d”,&y,&m,&d)!=EOF 则不会有错误出现。(原因我不太清楚,请各位大佬指教)
做题思路历程:
1.一开始我采用的方法是,创建一个月份数组将每个月所对应的日子提前写好,然后只需要用循环遍历求和即可, 但是出现了Time Limit Exceeded错误。
2.后来为了减少时间复杂度,用switch case写了12个语句,巨蠢,果不其然,还是 Time Limit Exceeded错误。
3.最终发现其实这两种方法都可以,问题出在EOF上,若没有!=EOF,则会报错。
EOF是一个计算机术语,为End Of File的缩写。
对于EOF的详细解释可以参考该博主的文章http://blog.youkuaiyun.com/yeruby/article/details/7489213。
代码如下:
#include<iostream>
using namespace std;
int main(){
int y,m,d;//分别表示年月日
bool bl;//当为true时表示为闰年,2月有29天
int month[13] = {0,0,31,59,90,121,151,181,212,243,273,304,334};
int daynum;
while(scanf("%d/%d/%d",&y,&m,&d)!=EOF){
daynum = 0;
if((y%4==0&&y%100!=0)||(y%400==0)) bl = true;
else bl = false;
if(m>2&&bl) daynum = month[m] + d + 1;
else if(m<=2||!bl) daynum = month[m] + d ;
cout<<daynum<<endl;
}
return 0;
}