计算的天2日期之间的数目的执行 [英] The implementation of calculating the number of days between 2 dates
问题描述
什么是计算两个日期之间的天数的最有效方法是什么?基本上,我问怎么了favourate日期时间库实现的。
我很快就实现了一个解决方案,那就是〜O(N),因为我通过每4个年51迭代运行。 ($附后C $ C)
有人问我的介绍到的问题,电脑类解决来实现这一点,但他们只是通过迭代中的每天的,而不是每4年..所以我并不满足于这种解决方案并提出了如下的。然而,有一个更有效的解决方案可用?如果是的话,他们是如何做到的呢?
的#include<的iostream>
使用名字空间std;
#定义check_leap(年)((年%400 == 0)||((年%4 == 0)及及(每年100%= 0))!)
#定义调试(N)COUT<< N'LT;< ENDL
INT get_days(INT月,布尔飞跃){
如果(月== 2){
如果(飞跃)返回29;
返回28;
}否则,如果(月== 1 ||一个月== 3 ||月== || 5月7 == ||一个月== || 8月== 10 ||一个月== 12){
返回31;
} 其他 {
返回30;
}
}
INT天[] = {31,59,90,120,151,181,212,243,273,304,334};
#定义days_prior_to_month(N)天[N-2]
INT num_days_between(INT MONTH1,诠释DAY1,诠释MONTH2,INT DAY2,布尔飞跃){
如果(MONTH2> MONTH1)
返程((days_prior_to_month(MONTH2) - days_prior_to_month(MONTH1 + 1))+ get_days(MONTH1,飞跃) - 第1天+ 1 +第2天)+((LEAP&安培;&安培; MONTH1< = 2及和2< = MONTH2)?1:0);
否则,如果(MONTH2 == MONTH1)
返回第2天;
返回-1;
}
INT主(INT ARGC,字符* argv的[]){
INT年,月,日,YEAR2,MONTH2,第2天;
COUT<< 年: ; CIN>>年;
COUT<< 月: ; CIN>>月;
COUT<< 日: ; CIN>>日;
COUT<< 2年; CIN>> YEAR2;
COUT<< 2个月; CIN>> MONTH2;
COUT<< 第2天:; CIN>>第2天;
INT总= 0;
如果(YEAR2!=年){
INT leapyears = 0;
总+ = num_days_between(月,日,12日,31日,check_leap(年));
调试(总);
共有+ = num_days_between(1,1,MONTH2,第2天,check_leap(YEAR2));
调试(总);
INT originalyear =年;
今年++;
年=年+年4%;
而(一年< = year2-1){
leapyears + = check_leap(年)? 1:0;
今年+ = 4;
}
共有+ = leapyears * 366;
调试(总);
共有+ = MAX(YEAR2 - originalyear - leapyears - 1,0)* 365;
调试(总);
} 其他 {
总= num_days_between(月,日,MONTH2,第2天,check_leap(年));
}
COUT<< 天在总数之间:<<总<< ENDL;
系统(暂停);
返回0;
}
您可以转换日期为儒略天数在O(1)。
两者相减儒略日数。
What's the most efficient way to calculate the number of days between 2 dates? Basically I'm asking how our favourate datetime libraries are implemented.
I quickly implemented a solution that is ~O(n) as I run through 1 iteration per 4 years. (Code attached below)
I was asked by an intro to problem solving with computers class to implement this, but they're simply iterating through everyday instead of every 4 years.. so I'm not content with that solution and came up with the one below. However, is there a more efficient solution available? If so, how do they accomplish it?
#include <iostream>
using namespace std;
#define check_leap(year) ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
#define debug(n) cout << n << endl
int get_days(int month, bool leap){
if (month == 2){
if (leap) return 29;
return 28;
} else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12){
return 31;
} else {
return 30;
}
}
int days[] = {31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
#define days_prior_to_month(n) days[n-2]
int num_days_between(int month1, int day1, int month2, int day2, bool leap){
if (month2 > month1)
return ((days_prior_to_month(month2) - days_prior_to_month(month1+1)) + get_days(month1, leap) - day1 + 1 + day2) + ((leap && month1 <= 2 && 2 <= month2) ? 1 : 0);
else if (month2 == month1)
return day2;
return -1;
}
int main(int argc, char * argv[]){
int year, month, day, year2, month2, day2;
cout << "Year: "; cin >> year;
cout << "Month: "; cin >> month;
cout << "Day: "; cin >> day;
cout << "Year 2: "; cin >> year2;
cout << "Month 2: "; cin >> month2;
cout << "Day 2: "; cin >> day2;
int total = 0;
if (year2 != year){
int leapyears = 0;
total += num_days_between(month, day, 12, 31, check_leap(year));
debug(total);
total += num_days_between(1, 1, month2, day2, check_leap(year2));
debug(total);
int originalyear = year;
year++;
year = year + year % 4;
while (year <= year2-1){
leapyears += check_leap(year) ? 1 : 0;
year += 4;
}
total += leapyears * 366;
debug(total);
total += max(year2 - originalyear - leapyears - 1, 0) * 365;
debug(total);
} else {
total = num_days_between(month, day, month2, day2, check_leap(year));
}
cout << "Total Number of Days In Between: " << total << endl;
system("PAUSE");
return 0;
}
You can convert a date to a Julian day number in O(1).
Subtract the two Julian day numbers.
这篇关于计算的天2日期之间的数目的执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!