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 ≤ 550,1900 ≤ 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;
}