#include<iostream>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<fstream>
#include<algorithm>
using namespace std;
class Date{
public:
int y,m,d;
Date(int a,int b,int c){
y=a;
m=b;
d=c;
}
};
//判断平闰年
bool leap(int y){
if(y%100==0){
if(y%400==0)return true;
else return false;
}
else if(y%4==0)return true;
else return false;
}
//计算[y1,y2)区间年的天数
int sumY(int y1,int y2){
int sum = 0;
for(int i = y1;i<y2;i++){
if(leap(i))sum+= 366;
else sum+=365;
}
return sum;
}
//计算[M1,M2)区间月的天数
int sumM(int M1,int M2,int y){
int sum = 0;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i = M1;i<M2;i++){
if(i==2)sum+= a[i]+leap(y);
else sum+=a[i];
}
return sum;
}
//计算两个日期相差天数
int sumD(Date a,Date b){
int mDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = 0;
if(a.y==b.y){
//计算该日期在该年的第几天
int day2A = sumM(1,a.m,a.y)+a.d;
int day2B = sumM(1,b.m,b.y)+b.d;
return abs(day2A-day2B);
}
else if(a.y>b.y){
day = sumM(1,a.m,a.y) + a.d + sumM(b.m+1,13,b.y)+ mDay[b.m]-b.d;//a年的前部分加上b年的后部分
if(b.m==2)day+=leap(b.y);// 补上后边部分可能落算的1天
}
else if(a.y<b.y){
day = sumM(a.m+1,13,a.y) +mDay[a.m]-a.d+ sumM(1,b.m,b.y)+b.d;//a年的后部分加上b年的前部分
if(a.m==2)day+=leap(a.y);// 补上后边部分可能落算的1天
}
int y1 = min(a.y,b.y);
int y2 = max(a.y,b.y);
day += sumY(y1+1,y2);//统一处理中间的年份
return day;
}
int main(){
//2011 11 11 周五
Date a = Date(2018,4,21);
Date b = Date(2020,1,1);
cout<<sumD(a,b)<<endl;
return 0;
}
如果有更好的算法欢迎评论交流