hdu 4515(关于时间的穿越)

题意:容易理解.

分析:对于这种类型的题目我们以后可以把它当做一种模板题来做,首先我要处理的就是把时间变到从一年的最后一天开始穿越,分为两种情况:一种是往前穿越,另一种是往后穿越,当写代码的时候有些区别需要注意的,具体看代码实现吧!!

代码实现:

 

#include<stdio.h>
#include<string.h>
int y=2013,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int runnian(int n)//判断是否是闰年
{
    if((n%4==0&&n%100!=0)||n%400==0)
        return 1;
    else
        return 0;
}
void nima1(int time)//往前穿越
{
    int i,t1,t2,t3,temp;
    for(i=y; ;i++)
    {
        temp=365;
        if(runnian(i))
            temp++;
        if(time<=temp)//发现这里有一个BUG,去掉等号实际上是错误的,可是在杭电上是能够AC的
            break;
        time=time-temp;
    }
    t1=i;
    a[2]=28;
    if(runnian(t1))
        a[2]++;
    for(i=1;i<=12;i++)
    {
        if(time<=a[i])
            break;
        time=time-a[i];
    }
    t2=i;
    t3=time;
    printf("%d/%02d/%02d",t1,t2,t3);
}
void nima2(int time)//往后穿越,相对于往前穿越有点麻烦
{
    int i,t1,t2,t3,temp;
    for(i=y-1;;i--)
    {
        temp=365;
        if(runnian(i))
           temp++;
        if(time<temp)//这里和往前穿越是不同的
            break;
        time=time-temp;
    }
    t1=i;
    a[2]=28;
    if(runnian(t1))
        a[2]++;
    for(i=12; ;i--)
    {
        if(i==0)
            i=12;
        if(time<a[i])//这里和往前穿越是不同的
            break;
        time=time-a[i];
    }
    t2=i;
    t3=a[i]-time;
    printf("%d/%02d/%02d",t1,t2,t3);
}
int main()
{
    int T,time,time1,time2;
    while(scanf("%d",&T)!=EOF)
    {
        while(T--)
        {
        
          scanf("%d",&time);
          time1=time+83;//首先我要进行变化,我都是变到从2012年12月31号开始穿越
          nima1(time1);
          printf(" ");
          time2=time-83;
          if(time2<0)
          {
             time2=83-time;
             nima1(time2);        
          }
          else
             nima2(time2);
          printf("\n");
        }
    }
    return 0;
}

 

 http://www.hxen.com/CET46/CET4/xiezuo/2011-12-14/163073.html

 

posted on 2013-06-05 12:07  后端bug开发工程师  阅读(246)  评论(0编辑  收藏  举报

导航