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) 编辑 收藏 举报