【发布时间】:2013-03-18 02:41:02
【问题描述】:
我得到了一个日期,我将其作为输入,例如(日、月、年):12, 03, 87。
现在我需要找出n 天之后的日期。
我为此编写了代码,但效率不高。你能告诉我任何运行速度更快且复杂性更低的好的逻辑吗?
#include <stdio.h>
static int days_in_month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day, month, year;
unsigned short day_counter;
int is_leap(int y) {
return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
}
next_day()
{
day += 1; day_counter++;
if (day > days_in_month[month]) {
day = 1;
month += 1;
if (month > 12) {
month = 1;
year += 1;
if (is_leap(year)) {
days_in_month[2] = 29;
} else {
days_in_month[2] = 28;
}
}
}
}
set_date(int d, int m, int y)
{
m < 1 ? m = 1 : 0;
m > 12 ? m = 12 : 0;
d < 1 ? d = 1 : 0;
d > days_in_month[m] ? d = days_in_month[m] : 0;
if (is_leap(y)){
days_in_month[2] = 29;
}
else {
days_in_month[2] = 28;
}
day = d;
month = m;
year = y;
}
skip_days(int x)
{
int i;
for (i=0;i<x;i++) next_day();
}
print_date()
{
printf ("day: %d month: %d year: %d\n", day, month, year);
}
int main(int argc, char **argv)
{
int i;
set_date(5, 2, 1980);
skip_days(40);
day_counter = 0;
/* after this call next_day each day */
print_date();
return 0;
}
【问题讨论】:
-
C 还是 C++?选择一个。
-
您已将问题标记为 C++,因此我建议您使用 boost's date/time。这将为您处理所有问题。
-
对 C 使用 Date and time utilities,对 C++ 使用 chrono library
-
@JeffPaquette 实际上,不,the homework tag is officially deprecated。
-
高效、记录在案的日历算法:howardhinnant.github.io/date_algorithms.html 无需迭代。
标签: c++ c date date-arithmetic