此题得到的经验:判断数据是否合法(可用)最好写成函数,减少不停的主函数写if else减少出错率,也避免把自己写晕。
比如这道题把判断闰年写成一个函数,然后把判断是否可以算日期差写成函数,不需要又把另外一类日期判断重写。其他情况都是直接输出合法的一种日期。
教训:认真读题,01/01/01是相同的日期直接输出就行(这个地方4个小时都没发现,赛后想哭)
#include<bits/stdc++.h>
using namespace std;
const int maxn=150;
int yue[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int check(int p)
{
if(p%400==0||(p%100!=0&&p%4==0))
return 366;
return 365;
}
int pan(int a,int b,int c)
{
if(b>0&&b<=12&&c>0&&(((b==1||b==3||b==5||b==8||b==7||b==10||b==12)&&c<=31)||((b==4||b==6||b==9||b==11)&&c<31)||(check(a+2000)==366&&b==2&&c<30)||c<29))
return 1;
return 0;
}
int main()
{
int T,a,b,c;
//ios::sync_with_stdio(false);
string s[15]={"","January","February","March", "April", "May", "June", "July", "August", "September", "October", "November" , "December"};
scanf("%d",&T);
while(T--)
{
scanf("%d/%d/%d",&a,&b,&c);
if(pan(a,b,c)+pan(c,a,b)==2)
{
int w1,w2;
w1=w2=0;
for(int i=0;i<a;i++)
{
int p=2000+i;
w1+=check(p);
}
for(int i=1;i<b;i++)
w1+=yue[i];
w1+=c;
if(check(a+2000)==366&&b>2)
w1++;
for(int i=0;i<c;i++)
{
int p=2000+i;
w2+=check(p);
}
for(int i=1;i<a;i++)
w2+=yue[i];
w2+=b;
if(check(c+2000)==366&&a>2)
w2++;
int ans=abs(w1-w2);
if(ans==0)
cout<<s[b]<<" "<<c<<", "<<2000+a<<endl;
else
cout<<ans<<endl;
}
else
{
if(pan(a,b,c))
cout<<s[b]<<" "<<c<<", "<<2000+a<<endl;
else
cout<<s[a]<<" "<<b<<", "<<2000+c<<endl;
}
}
return 0;
}