nefuoj
description |
<span style="font-family:SimSun;font-size:18px;">给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期)。只有闰年有2月29日,满足以下一个条件的年份为闰年:1. 年份能被4整除但不能被100整除2. 年份能被400整除</span> |
input |
<span style="font-family:SimSun;font-size:18px;">第一行为一个整数T,表示数据组数。之后每组数据包含两行。每一行格式为"month day, year",表示一个日期。month为{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"}中的一个字符串。day与year为两个数字。数据保证给定的日期合法且第一个日期早于或等于第二个日期。</span> |
output |
<span style="font-family:SimSun;font-size:18px;">对于每组数据输出一行,形如"Case #X: Y"。X为数据组数,从1开始,Y为答案。 </span> |
sample_input |
<span style="font-family:SimSun;font-size:18px;">2 January 12, 2012 March 19, 2012 August 12, 2899 August 12, 2901</span> |
sample_output |
<span style="font-family:SimSun;font-size:18px;">Case #1: 1 Case #2: 0</span> |
题解:因为这是14届大一的综合赛的题,所以我就顺便做了一下,这一道题是第一题,水题,模拟就行了,就是有点麻烦。。
code:
#include <iostream>#include <cstring>
#include <cstdio>
using namespace std;
int isrun(int n)//runnian
{
if(n%400==0) return 1;
if(n%4==0&&n%100!=0)
return 1;
return 0;
}
int main()
{
char month[12][15]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"};
int t;
char m1[15],m2[15];
int d1,d2,y1,y2,mn1,mn2;
int ans;
int c=1;
cin>>t;
while(t--)
{
ans=0;
scanf("%s %d,%d",m1,&d1,&y1);
getchar();
scanf("%s %d,%d",m2,&d2,&y2);
getchar();
printf("Case #%d: ",c++);
for(int i=0; i<12; i++)
{
if(strcmp(m1,month[i])==0)
{
mn1=i+1;
}
if(strcmp(m2,month[i])==0)
{
mn2=i+1;
}
}
//cout<<mn1<<' '<<mn2;//
if(y1==y2&&mn1<=2&&mn2>2)//判断同一年不同月份;
{
isrun(y1)? cout<<"1"<<endl: cout<<"0"<<endl;
continue;
}
if(y1==y2&&mn1<=2&&mn2==2)//判断同一年同一月份;
{
d2==29? cout<<"1"<<endl: cout<<"0"<<endl;
continue;
}
if(y1<y2)//判断不同年;
{
if(mn1<=2&&isrun(y1))
ans=1;
else
ans=0;
for(int i=y1+1; i<y2; i++)
if(isrun(i)) ans++;
if(isrun(y2)&&(mn2>2||d2==29))
ans++;
}
cout<<ans<<endl;
}
return 0;
}
下边是当初比赛公布出来的代码,不是我写的哦~~
code2:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char mon[12][10]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"};
int main()
{
int t,T=1;
scanf("%d",&t);
char month[2][10],c;
int m,d,y,m1,d1,y1;
int cnt;
while(t--)
{
cnt=0;
scanf("%s",month[0]);
scanf("%d%c%d",&d,&c,&y);
scanf("%s",month[1]);
scanf("%d%c%d",&d1,&c,&y1);
for(int i=0;i<12;i++)
if(strcmp(month[0],mon[i])==0)
{
m=i+1;
break;
}
for(int i=0;i<12;i++)
if(strcmp(month[1],mon[i])==0)
{
m1=i+1;
break;
}
if(y==y1)
{
if((y%400==0)||(y%4==0&&y%100!=0))
if((m==1||(m==2&&d<=29))&&(m1>2||(m1==2&&d1==29)))
cnt++;
}
else
{
if((y%400==0)||(y%4==0&&y%100!=0))
if((m==1)||(m==2&&d<=29)) cnt++;
cnt+=(y1-1)/4-(y1-1)/100+(y1-1)/400-(y/4-y/100+y/400);
if((y1%400==0)||(y1%4==0&&y1%100!=0))
if(m1>2||(m1==2&&d1==29)) cnt++;
}
printf("Case #%d: %d\n",T++,cnt);
}
return 0;
}
更多推荐
nefuoj
发布评论