此題得到的經驗:判斷數據是否合法(可用)最好寫成函數,減少不停的主函數寫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;
}