2015编程之美资格赛第一题

#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
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼儿LY

一切随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值