题目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
样例输入
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*10^9,暴力肯定不行,可小数据只有2000~3000啊。很快的码完代码,提交,WA,好,很干脆。然后仔细查看代码和想极限数据,果然是忘了同一年的两种特殊情况,改完后提交,WA。好吧,继续看。出了很多数据,一直没发现错误。然后发现这个比赛还是有讨论区的,进去看看,发现很多人第一题都在WA,有的人从上午WA到下午,好吧,鬼哭狼嚎。淡定,继续找。这是想到了读入方面,仔细检查,才发现有问题。但是题目描述中对日期为个位数时没有注明是只输入 1, 还是 01, (举例) ,测试样例中也没有。真是纠结啊,好吧,试试,改了一下,提交,AC。
总结来说,还是输在了对细节的处理还有读入时的问题。做了很多,还是不长记性,字符串的读入是最容易挖坑的。虽然这题不是英文的,但我感觉还是很有意义。谨记,谨记,字符串的处理一定要很小心才对。
#include <stdio.h>
#include <string.h>
int pan(int year)
{
if (year%400==0 || year%4==0 && year%100!=0)
return 1;
else return 0;
}
int pan2(char month[])
{
int n;
if (strcmp(month,"January")==0) n=1;
if (strcmp(month,"February")==0) n=2;
if (strcmp(month,"March")==0) n=3;
if (strcmp(month,"April")==0) n=4;
if (strcmp(month,"May")==0) n=5;
if (strcmp(month,"June")==0) n=6;
if (strcmp(month,"July")==0) n=7;
if (strcmp(month,"August")==0) n=8;
if (strcmp(month,"September")==0) n=9;
if (strcmp(month,"October")==0) n=10;
if (strcmp(month,"November")==0) n=11;
if (strcmp(month,"December")==0) n=12;
return n;
}
int main()
{
int day1,day2,k,i,year1,year2,sum,one,two,t,p1,p2;
char month1[10],month2[10],day11[10],day22[10];
scanf("%d",&t);
for (k=0;k<t;k++)
{
memset(month1,0,sizeof(month1));
memset(month2,0,sizeof(month2));
memset(day11,0,sizeof(day11));
memset(day22,0,sizeof(day22));
scanf("%s",month1); scanf("%s",day11); scanf("%d",&year1);
if (day11[1]==',')
day1=day11[0]-48;
else
day1=(day11[0]-48)*10+day11[1]-48;
//printf("%d\n",day1);
scanf("%s",month2); scanf("%s",day22); scanf("%d",&year2);
if (day22[1]==',')
day2=day22[0]-48;
else
day2=(day22[0]-48)*10+day22[1]-48;
//printf("%d\n",day2);
sum=0;
for (i=year1+1;i<=year2-1;i++)
if (pan(i)==1) sum++;
//printf("%d\n",sum);
//printf("%d",pan(2400));
one=pan2(month1);
two=pan2(month2);
p1=p2=0;
if (one<2 && pan(year1)==1 || one==2 && pan(year1)==1 && day1<=29)
{
sum++;
p1=1;
}
if (two>2 && pan(year2)==1 || two==2 && day2==29 && pan(year2)==1)
{
sum++;
p2=1;
}
//printf("%d %d\n",p1,p2);
if (year1==year2 && two==1 || year1==year2 && two==2 && day2<29) sum=0;
if (year1==year2 && one>2) sum=0;
if (year1==year2 && p1==1 && p2==1) sum--;
printf("Case #%d: %d\n",k+1,sum);
}
return 0;
}