回答編集履歴

3

コード修正

2018/12/24 00:36

投稿

shozi3
shozi3

スコア691

test CHANGED
@@ -30,7 +30,7 @@
30
30
 
31
31
  int getDays(date_t dt) {
32
32
 
33
- static const int mdays[] = {
33
+ static const int mdays_common[] = {
34
34
 
35
35
  0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
36
36
 
@@ -42,19 +42,13 @@
42
42
 
43
43
  };
44
44
 
45
- int prev = dt.year - 1,
45
+ const int* mdays = isLeapYear(dt.year) ? mdays_leap : mdays_common;
46
46
 
47
- ydays = prev * 365 + prev / 4 - prev / 100 + prev / 400;
47
+ int yprev = dt.year - 1,
48
48
 
49
- if (isLeapYear(dt.year)) {
49
+ ydays = yprev * 365 + yprev / 4 - yprev / 100 + yprev / 400;
50
50
 
51
- return ydays + mdays_leap[dt.month - 1] + dt.day;
52
-
53
- } else {
54
-
55
- return ydays + mdays[dt.month - 1] + dt.day;
51
+ return ydays + mdays[dt.month - 1] + dt.day;
56
-
57
- }
58
52
 
59
53
  }
60
54
 

2

コード修正

2018/12/24 00:36

投稿

shozi3
shozi3

スコア691

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- // 西暦1年1月1日からの日数を返す
29
+ // 西暦1年1月1日からの経過日数を返す
30
30
 
31
31
  int getDays(date_t dt) {
32
32
 
@@ -104,19 +104,13 @@
104
104
 
105
105
  for (int i = 0; i < len; i++) {
106
106
 
107
- int daysFrom = getDays(dtFrom[i]),
108
-
109
- daysTo = getDays(dtTo[i]);
110
-
111
-
112
-
113
107
  printf("%4d/%2d/%2d - %4d/%2d/%2d %6d days\n",
114
108
 
115
109
  dtFrom[i].year, dtFrom[i].month, dtFrom[i].day,
116
110
 
117
111
  dtTo[i].year, dtTo[i].month, dtTo[i].day,
118
112
 
119
- daysTo - daysFrom + 1 );
113
+ getDays(dtTo[i]) - getDays(dtFrom[i]) + 1 );
120
114
 
121
115
  }
122
116
 

1

コード修正

2018/12/23 05:42

投稿

shozi3
shozi3

スコア691

test CHANGED
@@ -13,6 +13,16 @@
13
13
  int year, month, day;
14
14
 
15
15
  } date_t;
16
+
17
+
18
+
19
+ // うるう年なら真を返す
20
+
21
+ int isLeapYear(int year) {
22
+
23
+ return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
24
+
25
+ }
16
26
 
17
27
 
18
28
 
@@ -32,21 +42,19 @@
32
42
 
33
43
  };
34
44
 
35
- int prev = dt.year - 1, days = 0,
45
+ int prev = dt.year - 1,
36
46
 
37
47
  ydays = prev * 365 + prev / 4 - prev / 100 + prev / 400;
38
48
 
39
- if (dt.year % 4 == 0 && dt.year % 100 != 0 || dt.year % 400 == 0) {
49
+ if (isLeapYear(dt.year)) {
40
50
 
41
- days = ydays + mdays_leap[dt.month - 1] + dt.day;
51
+ return ydays + mdays_leap[dt.month - 1] + dt.day;
42
52
 
43
53
  } else {
44
54
 
45
- days = ydays + mdays[dt.month - 1] + dt.day;
55
+ return ydays + mdays[dt.month - 1] + dt.day;
46
56
 
47
57
  }
48
-
49
- return days;
50
58
 
51
59
  }
52
60
 
@@ -96,9 +104,11 @@
96
104
 
97
105
  for (int i = 0; i < len; i++) {
98
106
 
99
- int daysFrom = getDays(dtFrom[i]);
107
+ int daysFrom = getDays(dtFrom[i]),
100
108
 
101
- int daysTo = getDays(dtTo[i]);
109
+ daysTo = getDays(dtTo[i]);
110
+
111
+
102
112
 
103
113
  printf("%4d/%2d/%2d - %4d/%2d/%2d %6d days\n",
104
114