题目链接:https://vjudge.net/contest/28079#problem/R
题目大意:给你分别给你两个日期(第二个日期大于等于第一个日期),闰年的2月29日称为闰日,让你求两个日期之间的闰日数量。
解题思路:①先求闰年数量,可以根据容斥原理,得到ans=(year2/4-year1/4)-(year2/100-year1/100)+(year2/400-year1/400)
②根据year1和year2的月份特判该年是否含闰日,注意一下上面的算式中ans包含了year2而没有包含year1所以判断时也有所不同,如果year2没有闰日ans-1,如果year1有闰日ans+1。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char s[20][20]={"","January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"}; 6 char tmp[20]; 7 8 int jg_month(void){ 9 for(int i=1;i<=12;i++){ 10 if(!strcmp(tmp,s[i])){ 11 return i; 12 } 13 } 14 } 15 16 bool is_leap(int year){ 17 if(year%4==0&&year%100!=0||year%400==0) 18 return true; 19 else 20 return false; 21 } 22 23 int main(){ 24 int T; 25 scanf("%d",&T); 26 int cas=0; 27 while(T--){ 28 int day1,year1,month1,day2,year2,month2; 29 scanf("%s%d,%d",tmp,&day1,&year1); 30 month1=jg_month(); 31 scanf("%s%d,%d",tmp,&day2,&year2); 32 month2=jg_month(); 33 //根据容斥原理 34 int ans=(year2/4-year1/4)-(year2/100-year1/100)+(year2/400-year1/400); 35 //根据year1,year2的月份进行特判 36 if(month1<=2&&is_leap(year1)) 37 ans++; 38 if(is_leap(year2)&&!(month2>=3||month2==2&&day2==29)) 39 ans--; 40 printf("Case %d: %d ",++cas,ans); 41 } 42 return 0; 43 }