特定日期计算

T1 特定日期计算

时间限制:1000ms

【问题描述】

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

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

a、年份能被4整除但不能被100整除

b、年份能被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 ≤ 5501900 ≤ year ≤ 3000

样例输入

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




这道题 不说难吧 就是可繁琐 需要注意到很多细节  少了哪一种情况都不行

放我的思想 :1.先分开来算 , 判断起始年之后 结束年之前 这数年间有几个闰年 有几个闰年 即会有几个2月29号

                         2.再判断起始年与结束年之间的关系 有两种可能

                               (1)起始年与结束年不是同一年

                                             先判断起始年是否为闰年 若为闰年 起始的月份是一月或二月的话 一定会有一个2月29号 总个数加1

                                             再判断结束年是否为闰年 若为闰年 结束的月份不是一月且不是二月 则一定会有一个2月29号 总个数加1

                                                                                                            结束的月份若是二月 ,结束那天为29号 总个数就加1

                               (2)起始年与结束年为同一年 

                                             判断这一年是否为闰年

                                                       若为闰年  第一种情况 起始月是1月结束月是2月 则结束那天是29号 总个数就加1

                                                                         第二种情况 起始月是1月结束月不是1月也不是2月 则必有2月29号 总个数加1

                                                                         第三种情况 起始月与结束月都是2月 在结束那天是29号 总个数就加1

                                                                         第四种情况 起始月为2月 结束月不是二月 则必有2月29号 总个数加1

  敲完这一段思想 我才发现 有的情况可以合并 我写的代码不是最简化的 仅作为参考 请读者见谅

#include <stdio.h>
#include <string.h>
struct Day
{
	char a[10];//月份最长单词为九位
	int ri;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
	int year;
};
int main()
{
	Day b[2]; //两个时间 一个开始日期 一个结束日期
	int t;
	scanf("%d",&t);
	char c[]={"January"};
	char d[]={"February"};
	int n=1;
	while(t--)
	{
		int i;
		for(i=0;i<2;i++)
		{
			scanf("%s",b[i].a);//字符串即月份 存到数组a中
			scanf("%d,%d",&b[i].ri,&b[i].year);
		}
	
		int j,sum=0;//sum记录包含多少个2月29
		for(j=b[0].year+1;j<b[1].year;j++)//判断起始年与结束年之间有几个闰年 
		{
			if((j%4==0&&j%100!=0)||j%400==0)//不包括起始年与结束年
			{
				sum++;//一个闰年代表必有一个2月29号
				
			}
		}
		if(b[0].year!=b[1].year)//如果起始年与结束年不是同一个年份
		{
		if(b[0].year%4==0&&b[0].year%100!=0||b[0].year%400==0)//判断起始年是否为闰年
		{
			if(strcmp(b[0].a,c)==0||strcmp(b[0].a,d)==0)//如果起始年为闰年,月份为1月或2月那么一定会有2月29号
			{
				sum++;
				
			}
		}
		if(b[1].year%4==0&&b[1].year%100!=0||b[1].year%400==0)//判断结束年是否为闰年
		{
			if(strcmp(b[1].a,c)!=0)//如果结束年为闰年,月份不是一月
			{
				if(strcmp(b[1].a,d)==0)//如果月份为二月
				{
					if(b[1].ri==29)//如果那天正好是29号 则总个数加1
					{
						sum++;
						
					}
				}
				else//此时月份既不是一月 也不是二月 则必会有2月29号 总个数加1
				{
					sum++;
				}
			}
		}
		}
		if(b[0].year==b[1].year)//如果起始年与结束年为同一年
		{
			if(b[0].year%4==0&&b[0].year%100!=0||b[0].year%400==0)//判断这一年是否为闰年
			{
				if(strcmp(b[0].a,c)==0&&(strcmp(b[1].a,c)!=0||strcmp(b[1].a,d)!=0))
				{
						sum++;//如果起始月份是1月 结束月份不是一月也不是二月 则必有2月29号 总个数加1
				}
				if(strcmp(b[0].a,d)==0&&strcmp(b[1].a,d)==0)
				{
					if(b[1].ri==29)//如果起始月份与结束月份都是2月 若结束那天是29号 总个数就加1
					{                                                                                                
                                          	sum++;
					}
				}
				if(strcmp(b[0].a,d)==0&&strcmp(b[1].a,d)!=0)
				{
					//如果起始月份是2月 结束月份不是2月  总个数就加1                             
					
						sum++;
					
				}
			}
		}
		printf("Case #%d: %d\n",n,sum);
		n++;
	}
	return 0;
}




                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值