题解 CF304B 【Calendar】
Fractures
2018-10-13 07:21:16
# 啊啊啊啊!为什么黑题掉紫了?我本来想水一道黑题啊!
……不过即便如此,这还是我第一次写紫题题解欸,鸡冻~
其实这道题~~很简单~~,思路就是把中间的几年算出来,再把第一年到第二年算出来,再就把第二年算出来就行了
```cpp
#include<cstdio>
#include<iomanip>
using namespace std;
int year1,month1,day1;
int year2,month2,day2;
int date;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool runnian(int n){//判断闰年
bool flag=false;
if((n%4==0&&n%100!=0)||n%400==0)flag=true;
return flag;
}
int main(){
scanf("%d:%d:%d",&year1,&month1,&day1);
scanf("%d:%d:%d",&year2,&month2,&day2);
if(year1>year2||(year1==year2&&month1>month2)||(year1==year2&&month1==month2&&day1>day2)){//保持year2比year1大
swap(year1,year2);
swap(day1,day2);
swap(month1,month2);
}
for(int i=year1+1;i<year2;i++){//算出中间的几年
date=date+365;
if(runnian(i)==true){//多加一天
date++;
}
}
for(int i=1;i<=month2;i++){//算出year2有几天
for(int j=1;j<=months[i];j++){
date++;
if(runnian(year2)==true){
if(i==2&&j==28)date++;
}
if(i==month2&&j==day2)break;
}
}
for(int i=month1;i<=12;i++){//算出year1有几天
for(int j=1;j<=months[i];j++){
date++;
if(runnian(year1)==true){
if(i==2&&j==28)date++;
}
}
}
date=date-day1;
if(year1==year2){//特判
date=date-365;
if(runnian(year1)==true)date--;
}
if(year1==year2&&month1==month2&&day1==day2)date=0;//暴力特判(本人很懒)
printf("%d",date);
return 0;
}
```