HDU-4515 小Q系列故事——世界上最遥远的距离

小Q系列故事——世界上最遥远的距离

Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1399    Accepted Submission(s): 501

Problem Description
  世界上最遥远的距离   不是生与死   而是我就站在你面前   你却不知道我爱你
  世界上最遥远的距离   不是我就站在你面前你却不知道我爱你   而是明明知道彼此相爱   却不能在一起
  世界上最遥远的距离   不是明明知道彼此相爱却不能在一起   而是相约好了私奔的时间   我穿越到了未来 你却回去了古代
    ——摘自《小Q失恋日记 》第117卷513页
  当小Q使出浑身解数,终于赢得HR女神芳心的时候,却出现了一个意外情况,那就是白富美HR的妈妈并不同意他们交往,当听说小Q只是一个码农,特别是听说小Q曾经参加过资本主义国家发起的SM/ICPC比赛的时候,更是坚决反对!   爱情是伟大的,但是得不到亲人祝福的爱情却备受折磨,小Q和HR相约在腾讯第二届编程马拉松大赛进行到第5天的时候(即2013年3月24日),一起“向前穿越D天,然后开启幸福新生活”。   其勇气可谓令人赞叹,但可怜的小Q却总是备受折磨——小Q理解的”向前穿越”是朝着未来的方向,而女友HR理解的“向前穿越”却是朝着古代的方向!   假设已知现在的日期和穿越的天数D,你能计算出小Q和女友各自到达的年代吗?
 
Input
  输入首先包含一个整数N,表示有N组测试用例;   接下来N行是N组数据,每一行包含一个正整数D(D<=10,0000),D表示向前穿越的天数。
 
Output
  请计算并输出小Q和女友分别到达的日期,日期格式为YYYY/MM/DD,两个日期中间用一个空格隔开,每组数据占一行,具体输出格式请参见样例。
 
Sample Input
2
6
30
 
Sample Output
2013/03/30 2013/03/18
2013/04/23 2013/02/22
 
Source
 
Recommend
liuyiding
  1 #include<stdio.h>
  2 int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
  3 int leap(int n)
  4 {
  5     if((n%4==0&&n%100!=0)||n%400==0)
  6         return 1;
  7     else
  8         return 0;
  9 }
 10 int main()
 11 {   
 12     int t,yy,mm,dd,d,x,yy1,g,yy2,p,f;
 13         scanf("%d",&t);
 14      while(t--)
 15      { 
 16          scanf("%d",&d);
 17           yy=2013;mm=3;dd=24;yy1=2013;yy2=2013;
 18           x=d+83;
 19          while(1)//判断该年是为闰年还是平年,等到日子小于一年结束循环。while(1)可算一个技巧。
 20          {
 21              if(leap(yy1))
 22              {
 23                  if(x<=366)
 24                  {
 25                       break;
 26                  }
 27                  else
 28                  {
 29                      yy1++;
 30                      x-=366;
 31                  }
 32              }
 33              else
 34              {
 35                  if(x<=365)
 36                  {
 37                      break;
 38                  }
 39                  else
 40                  {
 41                      yy1++;
 42                      x-=365;
 43                  }
 44              }
 45          }
 46            g=0;
 47          if(leap(yy1))
 48              a[1]=29;//闰年就定义a【1】为29。
 49           while(x>a[g])
 50          {
 51              x-=a[g];
 52              g++;
 53          }//g代表月x就代表天。
 54               a[1]=28;//把a【1】要还原,不要丢,要注意细节。
 55          printf("%04d/%02d/%02d ",yy1,g+1,x);
 56          if(d<83)//前面的计算完。
 57          {
 58              if(d<24)
 59                printf("2013/03/%d
",24-d);
 60              else if(d<52)
 61                printf("2013/02/%d
",52-d);
 62              else
 63                printf("2013/01/%d
",83-d);
 64          }
 65          else
 66          {
 67              p=d-82;
 68              yy2--;//少了一年,就要减掉。
 69              while(1)
 70              {
 71                  if(leap(yy2))
 72                  {
 73                      if(p<=366)
 74                      {
 75                          break;
 76                      }
 77                      else
 78                      {
 79                          p-=366;
 80                          yy2--;
 81                      }
 82                  }
 83                  else
 84                  {
 85                      if(p<=365)
 86                      {
 87                         
 88                          break;
 89                      }
 90                      else
 91                      {
 92                          p-=365;
 93                          yy2--;
 94                      }
 95                  }
 96              }
 97              f=11;//倒着从后面算起,注意从12月开始后退。
 98             if(leap(yy2))
 99                 a[1]=29;
100             while(p>a[f])
101             {
102                 p-=a[f];
103                 f--;
104             }
105             a[1]=28;
106             printf("%04d/%02d/%02d
",yy2,f+1,a[f]-p+1);//注意加1.
107          }
108      }
109      return 0;
110 }
 
 
原文地址:https://www.cnblogs.com/cancangood/p/3259789.html