微软编程之美2015 第一题

本文通过分享一次在编程比赛中遇到的具体问题,强调了细节处理和字符串读入问题在编程中的关键作用。作者详细阐述了如何识别并解决与日期判断、闰年规则以及数据输入格式相关的问题,最终通过多次调试和验证成功通过了挑战。文章旨在提醒程序员们在实际编程过程中,要时刻保持警惕,仔细检查输入输出细节,以避免因疏忽而导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值