前言:
21考研,正在啃《算法笔记》,不论能否进复试记录一下准备路上写下的垃圾代码。
解答:
#include<cstdio>
char daytable[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
bool isleapyear(int year){
return((year%4==0&&year%100!=0)||year%400==0);
}
int main()
{
int startdate=0,enddate=0,diff=0;
int syear,eyear,smonth,emonth,sday,eday;//记录两个日期的年月日
while(scanf("%d%d",&startdate,&enddate)!=EOF){
if(startdate>enddate){ //调整日期大小顺序
int temp=enddate;
enddate=startdate;
startdate=temp;
}
sday=startdate%100;smonth=(startdate-sday)%10000/100;syear=startdate/10000;
eday=enddate%100;emonth=(enddate-eday)%10000/100;eyear=enddate/10000;
if(startdate==enddate)
printf("0\n");
else if((eyear==syear&&smonth==emonth&&(eday-sday)==1)||(eyear==syear&&(emonth-smonth)==1&&eday==1&&sday==daytable[isleapyear(syear)][smonth]))//暴力判断日期相邻
printf("2\n");
else if(eyear!=syear){ //不同年处理
for(int i=12 ;i>=smonth;i--)
diff+=daytable[isleapyear(syear)][i];
diff-=sday;
while((syear+1)<eyear){
if(isleapyear(syear))
diff+=366;
else
diff+=365;
syear++;
}
for(int i=0 ; i<emonth ;i++)
diff+=daytable[isleapyear(eyear)][i];
diff+=eday;
printf("%d\n",diff);
}
else{ //同年处理
while(emonth!=smonth){
diff+=daytable[isleapyear(syear)][smonth];
smonth++;
}
diff=diff-sday+eday+1;
printf("%d\n",diff);
}
diff=0;
}
return 0;
}
代码写的很烂,还有bug没找出来,自己测试没发现错误的例子,但codeup上提交只能对一半。