2015编程之美资格赛:2月29日

来源:互联网 发布:windows专业版激活码 编辑:程序博客网 时间:2024/05/01 20:12

题目1 : 2月29日

时间限制:2000ms
单点时限:1000ms
内存限制:256MB

描述

给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。

只有闰年有2月29日,满足以下一个条件的年份为闰年:

1. 年份能被4整除但不能被100整除

2. 年份能被400整除

输入

第一行为一个整数T,表示数据组数。

之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。

数据保证给定的日期合法且第一个日期早于或等于第二个日期。

输出

对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。

数据范围

1 ≤ T ≤ 550

小数据:

2000 ≤ year ≤ 3000

大数据:

2000 ≤ year ≤ 2×109

样例输入
4January 12, 2012March 19, 2012August 12, 2899August 12, 2901August 12, 2000August 12, 2005February 29, 2004February 29, 2012
样例输出
Case #1: 1Case #2: 0Case #3: 1Case #4: 3

#include <iostream>#include <cstdio>#include <string.h>#include <cstdlib>using namespace std;bool IsRun(int n){if(n%4 == 0 && n%100 != 0)return true;else if(n%400 ==0)return true;else return false;}int monToInt(const char *a){if(strcmp(a,"January") == 0)return 1;else if(strcmp(a,"February") == 0)return 2;else if(strcmp(a,"March") == 0)return 3;else if(strcmp(a,"April") == 0)return 4;else if(strcmp(a,"May") == 0)return 5;else if(strcmp(a,"June") == 0)return 6;else if(strcmp(a,"July") == 0)return 7;else if(strcmp(a,"August") == 0)return 8;else if(strcmp(a,"September") == 0)return 9;else if(strcmp(a,"October") == 0)return 10;else if(strcmp(a,"November") == 0)return 11;else if(strcmp(a,"December") == 0)return 12;else return -1;}int main(){int T;scanf("%d",&T);int test = 0;while(T--){test++;char mon1[10],mon2[10];memset(mon1,0,10*sizeof(char));memset(mon2,0,10*sizeof(char));int day1,year1;int day2,year2;scanf("%s %d,%d",mon1,&day1,&year1);scanf("%s %d,%d",mon2,&day2,&year2);int mon1_int,mon2_int;mon1_int = monToInt(mon1);mon2_int = monToInt(mon2);if(mon1_int == -1 || mon2_int == -1){printf("month error\n");break;}int num = 0;if(year2 - year1 < 0 ){//donothing}else if(year1 == year2){bool tem = IsRun(year1); if(IsRun(year1) && (mon1_int == 1 || (mon1_int == 2 && day1 <= 29)) && (mon2_int > 2 || ( mon2_int == 2 && day2 == 29)))num++;}else if(year1 - year2 == 1){if(IsRun(year1) && mon1_int < 2)num++;else if(IsRun(year1) && mon1_int == 2 && day1 <= 29)num++;if(IsRun(year2) && mon2_int > 2)num++;else if(IsRun(year2) && mon2_int == 2 && day2 == 29)num++;}else{for(int i = year1 + 1;i < year2;++i){if(IsRun(i))num++;}if(IsRun(year1) && mon1_int < 2)num++;else if(IsRun(year1) && mon1_int == 2 && day1 <= 29)num++;if(IsRun(year2) && mon2_int > 2)num++;else if(IsRun(year2) && mon2_int == 2 && day2 == 29)num++;} printf("Case #%d: %d\n",test,num);}//getchar();//getchar();//getchar();return 0;}


0 0
原创粉丝点击