微软编程之美2015 第一题

来源:互联网 发布:淘宝客怎么推广宝贝 编辑:程序博客网 时间:2024/04/30 13:41

题目1 : 2月29日

时间限制:2000ms

单点时限:1000ms

内存限制:256MB

 

描述

给定两个日期,计算这两个日期之间有多少个229日(包括起始日期)。

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

1. 年份能被4整除但不能被100整除

2. 年份能被400整除

输入

第一行为一个整数T,表示数据组数。

之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。dayyear为两个数字。

数据保证给定的日期合法且第一个日期早于或等于第二个日期。

输出

对于每组数据输出一行,形如"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;}


0 0
原创粉丝点击