HDOJ_2005_第几天

来源:互联网 发布:电脑家教一对一软件 编辑:程序博客网 时间:2024/05/12 08:01

题目:
给定一个日期,输出这个日期是该年的第几天。

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.csdn.net/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;}