小Q系列故事——世界上最遥远的距离
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1223 Accepted Submission(s): 423
世界上最遥远的距离
不是生与死
而是我就站在你面前
你却不知道我爱你
世界上最遥远的距离
不是我就站在你面前你却不知道我爱你
而是明明知道彼此相爱
却不能在一起
世界上最遥远的距离
不是明明知道彼此相爱却不能在一起
而是相约好了私奔的时间
我穿越到了未来 你却回去了古代
——摘自《小Q失恋日记 》第117卷513页
当小Q使出浑身解数,终于赢得HR女神芳心的时候,却出现了一个意外情况,那就是白富美HR的妈妈并不同意他们交往,当听说小Q只是一个码农,特别是听说小Q曾经参加过资本主义国家发起的SM/ICPC比赛的时候,更是坚决反对!
爱情是伟大的,但是得不到亲人祝福的爱情却备受折磨,小Q和HR相约在腾讯第二届编程马拉松大赛进行到第5天的时候(即2013年3月24日),一起“向前穿越D天,然后开启幸福新生活”。
其勇气可谓令人赞叹,但可怜的小Q却总是备受折磨——小Q理解的”向前穿越”是朝着未来的方向,而女友HR理解的“向前穿越”却是朝着古代的方向!
假设已知现在的日期和穿越的天数D,你能计算出小Q和女友各自到达的年代吗?
接下来N行是N组数据,每一行包含一个正整数D(D<=10,0000),D表示向前穿越的天数。
2 6 30
2013/03/30 2013/03/18 2013/04/23 2013/02/22分析:这种题目之前想的就是按照月或者年算,但是因为数据都是随机的,所以,实在是太麻烦,通用性不好,刚看了网上的代码,用天算,反正天数也不会很大,并且程序很灵活,分享一下(WA了,但是思路是这样的,稍后会检查更新。。)
//D<100000 #include<stdio.h> #include<string.h> int md[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int isLoopYear(int y){ if((y%4==0&&y%100!=0)||(y%400)==0) return 1; else return 0; } void getADay(int y, int m, int d,int days){//向后推 int i; for(i = 1;i <= days;i++){//按照天算比较灵活 if(isLoopYear(y)) md[2] = 29; else md[2] = 28; d++; if(d > md[m]){ d = 1; m++; if(m > 12){ m=1; y++; } } } //printf("%d\t%04d/%02d/%02d ",days,y,m,d); printf("%04d/%02d/%02d ",y,m,d); } void getBDay(int y, int m, int d, int days){//向前推 int i; for(i=1;i<=days;i++){ if(isLoopYear(y)) md[2]=29; else md[2]=28; d--; if(d<1){ m--; if(m<1){ m=12; y--; } d=md[m]; } } printf("%04d/%02d/%02d\n",y,m,d); }
int main(){ //freopen("in.txt","r",stdin); //freopen("out1.txt","w",stdout); int y=2013, m=3, d=24, days,n; scanf("%d",&n); while(n--){ scanf("%d",&days); getADay(y,m,d,days); getBDay(y,m,d,days); } //system("pause"); return 0; }