回答編集履歴
3
コード修正
answer
CHANGED
@@ -14,19 +14,16 @@
|
|
14
14
|
|
15
15
|
// 西暦1年1月1日からの経過日数を返す
|
16
16
|
int getDays(date_t dt) {
|
17
|
-
static const int
|
17
|
+
static const int mdays_common[] = {
|
18
18
|
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
|
19
19
|
};
|
20
20
|
static const int mdays_leap[] = {
|
21
21
|
0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335
|
22
22
|
};
|
23
|
+
const int* mdays = isLeapYear(dt.year) ? mdays_leap : mdays_common;
|
23
|
-
int
|
24
|
+
int yprev = dt.year - 1,
|
24
|
-
ydays =
|
25
|
+
ydays = yprev * 365 + yprev / 4 - yprev / 100 + yprev / 400;
|
25
|
-
if (isLeapYear(dt.year)) {
|
26
|
-
return ydays + mdays_leap[dt.month - 1] + dt.day;
|
27
|
-
} else {
|
28
|
-
|
26
|
+
return ydays + mdays[dt.month - 1] + dt.day;
|
29
|
-
}
|
30
27
|
}
|
31
28
|
|
32
29
|
// エントリーポイント
|
2
コード修正
answer
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
|
13
13
|
}
|
14
14
|
|
15
|
-
// 西暦1年1月1日からの日数を返す
|
15
|
+
// 西暦1年1月1日からの経過日数を返す
|
16
16
|
int getDays(date_t dt) {
|
17
17
|
static const int mdays[] = {
|
18
18
|
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
|
@@ -51,13 +51,10 @@
|
|
51
51
|
// 経過日数の算出
|
52
52
|
int len = sizeof(dtFrom) / sizeof(date_t);
|
53
53
|
for (int i = 0; i < len; i++) {
|
54
|
-
int daysFrom = getDays(dtFrom[i]),
|
55
|
-
daysTo = getDays(dtTo[i]);
|
56
|
-
|
57
54
|
printf("%4d/%2d/%2d - %4d/%2d/%2d %6d days\n",
|
58
55
|
dtFrom[i].year, dtFrom[i].month, dtFrom[i].day,
|
59
56
|
dtTo[i].year, dtTo[i].month, dtTo[i].day,
|
60
|
-
|
57
|
+
getDays(dtTo[i]) - getDays(dtFrom[i]) + 1 );
|
61
58
|
}
|
62
59
|
|
63
60
|
return 0;
|
1
コード修正
answer
CHANGED
@@ -7,6 +7,11 @@
|
|
7
7
|
int year, month, day;
|
8
8
|
} date_t;
|
9
9
|
|
10
|
+
// うるう年なら真を返す
|
11
|
+
int isLeapYear(int year) {
|
12
|
+
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
|
13
|
+
}
|
14
|
+
|
10
15
|
// 西暦1年1月1日からの日数を返す
|
11
16
|
int getDays(date_t dt) {
|
12
17
|
static const int mdays[] = {
|
@@ -15,14 +20,13 @@
|
|
15
20
|
static const int mdays_leap[] = {
|
16
21
|
0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335
|
17
22
|
};
|
18
|
-
int prev = dt.year - 1,
|
23
|
+
int prev = dt.year - 1,
|
19
24
|
ydays = prev * 365 + prev / 4 - prev / 100 + prev / 400;
|
20
|
-
if (dt.year
|
25
|
+
if (isLeapYear(dt.year)) {
|
21
|
-
|
26
|
+
return ydays + mdays_leap[dt.month - 1] + dt.day;
|
22
27
|
} else {
|
23
|
-
|
28
|
+
return ydays + mdays[dt.month - 1] + dt.day;
|
24
29
|
}
|
25
|
-
return days;
|
26
30
|
}
|
27
31
|
|
28
32
|
// エントリーポイント
|
@@ -47,8 +51,9 @@
|
|
47
51
|
// 経過日数の算出
|
48
52
|
int len = sizeof(dtFrom) / sizeof(date_t);
|
49
53
|
for (int i = 0; i < len; i++) {
|
50
|
-
int daysFrom = getDays(dtFrom[i])
|
54
|
+
int daysFrom = getDays(dtFrom[i]),
|
51
|
-
|
55
|
+
daysTo = getDays(dtTo[i]);
|
56
|
+
|
52
57
|
printf("%4d/%2d/%2d - %4d/%2d/%2d %6d days\n",
|
53
58
|
dtFrom[i].year, dtFrom[i].month, dtFrom[i].day,
|
54
59
|
dtTo[i].year, dtTo[i].month, dtTo[i].day,
|