年份相差比较大 , 所以需要特殊处理一下 , 这一道题的数据量比较大 , 不优化的话 , 会超时 . 当程序写好之后 有错误 , 目前没发现 , 明天再看一下
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<limits.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<set> 10 #include<stack> 11 #include<string> 12 #include<sstream> 13 #include<map> 14 #include<cctype> 15 using namespace std; 16 // 1 , 年份不同的话 计算中间的 年差 , 然后再计算 , 不完整的年 , 的差 17 // 2 , 年份相同的话 计算 中间的日期差 18 bool is_leap_year(int n) 19 { 20 if((n%4==0&&n%100!=0)||n%400==0) 21 return true; 22 return false; 23 } 24 int main() 25 { 26 int t,year1,year2,month1,month2,day1,day2,days,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; 27 scanf("%d",&t); 28 while(t--) // 中间 是 从 1900 年 到 100万年 中间的 年数比较多 29 { 30 days=0; 31 scanf("%d%d%d%d%d%d",&year1,&month1,&day1,&year2,&month2,&day2); // 每四百年 都 是 146097 天 . 32 if(year1!=year2) 33 { 34 int time=max(0,year2-year1-1)/400; // 有几个四百年 ? 35 days=time*146097; // 按照完整的 四百年来说 有这么多天 36 year1=year1+time*400; // 37 for(int i=year1+1;i<year2;i++) 38 { 39 if(is_leap_year(i)) 40 days+=366; 41 else 42 days+=365; 43 } // 年份不同的话 , 中间的年份已经处理完毕 . 44 if(is_leap_year(year1)) 45 { 46 for(int i=month1+1;i<=12;i++) 47 days+=b[i]; 48 days+=b[month1]-day1+day2; 49 for(int i=1;i<month2;i++) 50 days+=b[i]; 51 } 52 else 53 { 54 for(int i=month1+1;i<=12;i++) 55 days+=a[i]; 56 days+=a[month1]-day1+day2; 57 for(int i=1;i<month2;i++) 58 days+=b[i]; 59 } // 年份不同的情况处理完毕 . 60 } 61 else // 年份相同的话 62 { 63 if(month1==month2) // 并且 月份 相同的话 64 { 65 days=day2-day1; 66 } 67 else // 年份 相同 处理完毕 68 { 69 if(is_leap_year(year1)) 70 { 71 for(int i=month1+1;i<month2;i++) 72 days+=b[i]; 73 days+=b[month1]-day1+day2; 74 } 75 else 76 { 77 for(int i=month1+1;i<month2;i++) 78 days+=a[i]; 79 days+=a[month1]-day1+day2; 80 } // 年份不同处理完毕 81 } 82 } 83 printf("%d\n",days); 84 } 85 return 0; 86 }
时间: 2024-11-03 01:37:29