计算两个日期之间间隔多少天
输入开始日期和结束日期:
日期应以yyyy-mm-dd格式输入,使用年份的四位数,例如2001-05-21。
代码一:时间复杂度是o(n),这里的n是年数
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const static int days[2][12] = {
{31,28,31,30,31,30,31,31,30,31,30,31}, //平年
{31,29,31,30,31,30,31,31,30,31,30,31}, //闰年
};
string s1,s2;
bool isRunYear(int year)
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else
return false;
}
int date_date(string s1,string s2)
{
string start = s1 < s2 ? s1 : s2;
string end = s2 > s1 ? s2 : s1;
int startYear,startMonth,startDay;
int endYear,endMonth,endDay;
sscanf(start.c_str(),"%d-%d-%d",&startYear,&startMonth,&startDay);
sscanf(end.c_str(),"%d-%d-%d",&endYear,&endMonth,&endDay);
int day = 0;
for(int y = 1;y < startYear;y++)
day -= isRunYear(y) ? 366 : 365;
for(int y = 1;y < endYear;y++)
day += isRunYear(y) ? 366 : 365;
int gap = isRunYear(startYear);
for(int m = 1;m < startMonth;m++)
day -= days[gap][m-1];
gap = isRunYear(endYear);
for(int m = 1;m < endMonth;m++)
day += days[gap][m-1];
day += endDay - startDay;
if(day < 0) day = 0;
return day;
}
int main()
{
cin >> s1 >> s2;
cout << date_date(s1,s2) << endl;
return 0;
}
代码二:虽然说时间复杂度还是o(n),n是年份,或者说是o(max(n,m)),m是月份,因为很小,所以前面没算,这里还是看成o(n),虽然说还是o(n)但是性能要比上面的算法好很多,因为这个算法是计算两个年份之间的天数,不需要从0001年开始计算总天数。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const static int days[2][12] = {
{31,28,31,30,31,30,31,31,30,31,30,31}, //平年
{31,29,31,30,31,30,31,31,30,31,30,31}, //闰年
};
string s1,s2;
bool isRunYear(int year)
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
else
return false;
}
int date_date(string s1,string s2)
{
string start = s1 < s2 ? s1 : s2;
string end = s2 > s1 ? s2 : s1;
int startYear,startMonth,startDay;
int endYear,endMonth,endDay;
sscanf(start.c_str(),"%d-%d-%d",&startYear,&startMonth,&startDay);
sscanf(end.c_str(),"%d-%d-%d",&endYear,&endMonth,&endDay);
int day = 0;
if(startYear != endYear)
{
int gap = isRunYear(startYear);
for(int m = startMonth;m <= 12;m++)
day += days[gap][m-1] - startDay + 1,startDay = 1;
}
for(int y = startYear + 1;y < endYear;y++)
day += isRunYear(y) ? 366 : 365;
int gap = isRunYear(endYear);
for(int m = 1;m < endMonth;m++)
day += days[gap][m-1];
day += endDay;
return day - 1;
}
int main()
{
cin >> s1 >> s2;
cout << date_date(s1,s2) << endl;
return 0;
}