HDOJ_2005_第几天

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

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值