2015编程之美资格赛第一题
2015-04-19 23:22
489 查看
#include<iostream> #include<stdio.h> #include<string> #include<string.h> using namespace std; struct Date { int month; int day; int year; }; //把月份由数字转换成数字型 int str2IntMonth(char month[]) { string months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}; for(int i=0;i<12;i++) { if(string(month)==months[i]) { return i+1; } } return -1; } //是否闰年 bool isLeapYear(int year) { if((year%400==0)||((year%4==0)&&(year%100!=0))) return true; return false; } //验证日期是否合法 bool isDateLegal(Date date) { if(date.year>=2000&&date.year<=3000) { if(date.month>=1&&date.month<=12) { if(date.month==2){ if(isLeapYear(date.year)) { if(date.day<=29&&date.day>=1) return true; else return false; } else { if(date.day<=28&&date.day>=1) return true; else return false; } } else if(date.month==1||date.month==3||date.month==5||date.month==7||date.month==8||date.month==10||date.month==12) { if(date.day<=31&&date.day>=1) return true; else return false; } else { if(date.day<=30&&date.day>=1) return true; else return false; } } } return false; } //验证两个日期是否合法,第一个早于或等于第二个日期即合法 bool isNormal(Date first,Date second) { if((first.year>second.year)||((first.year==second.year)&&(first.month>second.month)) ||((first.year==second.year)&&(first.month==second.month)&&(first.day>second.day))) return false; return true; } //计算两个日期之间有多少个2月29 int count2m29(Date first,Date second) { Date cmp229={2,29,first.year}; int count=0; if(!isNormal(first,second))//是否是第一个日期早于第二个日期 { cout<<"第一个日期迟于第二个日期!"<<endl; return -1; } while(cmp229.year>=first.year&&cmp229.year<=second.year) { if(isNormal(first,cmp229)&&isNormal(cmp229,second)) { if(isLeapYear(cmp229.year)) { count++; } } cmp229.year++; } return count; } int main() { int T,num; char start[50]={0},over[50]={0},monthtmp[15]={0}; Date first={1,1,2000},second={1,1,2000}; cin>>T; if(T<1||T>550) return -1; num=0; while(T--) { memset(start,0,sizeof(char)*50); memset(over,0,sizeof(char)*50); memset(monthtmp,0,sizeof(char)*15); num++; getchar(); cin.get(start,50); getchar(); cin.get(over,50); sscanf(start,"%s %d, %d",monthtmp,&first.day,&first.year); first.month=str2IntMonth(monthtmp); if(!isDateLegal(first))//是否合法 { cout<<"日期不合法!"<<endl; return -1; } memset(monthtmp,0,sizeof(char)*15); sscanf(over,"%s %d, %d",monthtmp,&second.day,&second.year); second.month=str2IntMonth(monthtmp); if(!isDateLegal(second))//是否合法 { cout<<"日期不合法!"<<endl; return -1; } printf("Case #%d: %d\n",num,count2m29(first,second)); } return 0; }
时间限制: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
样例输入
4 January 12, 2012 March 19, 2012 August 12, 2899 August 12, 2901 August 12, 2000 August 12, 2005 February 29, 2004 February 29, 2012
样例输出
Case #1: 1 Case #2: 0 Case #3: 1 Case #4: 3
相关文章推荐
- 2月29日(编程之美2015资格赛)
- 编程之美2015资格赛#3
- 【题解】2015编程之美资格赛 CodeHunt C#满分参考与总结
- 2015编程之美资格赛 A 2月29日
- 2015编程之美资格赛题目2 : 回文字符序列
- 编程之美大赛资格赛第一题
- 2015 编程之美 资格赛 第一题 hihocoder 区间闰年 2月29 数量 模拟题
- 回文字符序列(编程之美2015资格赛)
- 2015编程之美资格赛 B 回文字符序列
- hiho 编程之美2015资格赛(2月29日-模拟日期)
- 编程之美2015资格赛 A 2月29日
- 2015编程之美资格赛2题—区间dp
- 编程之美2015资格赛 题目1 : 2月29日
- 编程之美2015资格赛 - 题目1 : 2月29日
- 编程之美2015资格赛-题目1 2月29日
- 2015编程之美资格赛 C 基站选址
- hiho 编程之美2015资格赛(回文字符序列-回文子序列数)
- 编程之美2015资格赛 B题 回文字符序列 (动态规划)
- 【编程之美2015资格赛】基站选址(数学题)
- 编程之美2015资格赛 A.2月29日