hdu4515小Q系列故事——世界上最遥远的距离(几点注意的地方以及测试数据)
很恶心的模拟题.......不过编完后,有着一些收获,以后的年月日题目都可以以这个代码为模板了。
注意:这道题目加日期很好编,只要注意每次在加的时候,在月的时候,先转为某个月份的最后一天,然后再去判断大于这个的月份就直接减去这个月份,在年的转化中,都将它转为****/12/31,再去一年一年的加减.......
加法的测试数据:
38
39
282
283
7
8
减法的时候,就要注意好多了,我一开始按照加法的细节处理来处理减法,发现各种细节错误,在月份的时候,要转为钱一个月的最后一天,就是当day “大于等于"这个月份的时候,将这个月份减去(注意,这里不同于加法),这样可以避免出现2013/02/00的情况,在转化年的时候,要转为前一年的12/31,避免出现2013/01/00这种情况
减法测试数据:
52
87345
24
23
100000
下面是代码:
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int s[300],t[300],a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; s[0]=282; t[0]=83; int sum=282; //这是加法的初始值,你会发现,加上282天就是2013、12、31 for(int i=2014;i<=2013+298;i++) { if(i%4==0&&i%100!=0||i%400==0) sum+=366; else sum+=365; s[i-2013]=sum; } sum=83; //这是减法的初始值,你会发现,减去83就是2012、12、31 for(int i=2012;i>=2013-298;i--) { if(i%4==0&&i%100!=0||i%400==0) sum+=366; else sum+=365; t[2013-i]=sum; } int text; scanf("%d",&text); while(text--) { int day; scanf("%d",&day); int day1=day; int year,mon,i=0; for(;i<=298;i++) if(day<=s[i]) //注意,这里去加法的算法,与减法不同 break; year=i+2013; if(i==0) { if(day<=31-24) { mon=3; day=24+day; } else { day-=7; int j; for(j=4;j<=11;j++) if(day>a[j]) //注意.....区别减法 day-=a[j]; else break; mon=j; } } else { day-=s[i-1]; if(s[i]-s[i-1]==366) a[2]++; int j; for(j=1;j<=11;j++) if(day>a[j]) day-=a[j]; else break; mon=j; if(s[i]-s[i-1]==366) a[2]--; } printf("%04d/%02d/%02d ",year,mon,day); day=day1; i=0; for(;i<=298;i++) if(day<t[i]) //不同之处....... break; year=2013-i; if(i==0) { if(day<=24-1) { mon=3; day=24-day; } else { day-=24; int j; for(j=2;j>=1;j--) if(day>=a[j]) //不同之处 day-=a[j]; else break; mon=j; day=a[j]-day; } } else { day-=t[i-1]; //printf("\n%d\n",day); if(t[i]-t[i-1]==366) a[2]++; int j=12; for(;j>=2;j--) if(day>=a[j]) //注意 day-=a[j]; else break; mon=j; //printf("%d\n",day); day=a[j]-day; //printf("\n%d %d\n",day,a[j]); if(t[i]-t[i-1]==366) a[2]--; } printf("%04d/%02d/%02d\n",year,mon,day); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。