LightOJ 1414 February 29(闰年统计+容斥原理)

题目链接: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\n",++cas,ans);        
41     }
42     return 0;
43 } 

 

posted @ 2017-08-29 20:13  Yeader  阅读(323)  评论(0编辑  收藏  举报