teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

コード修正

2018/12/24 00:36

投稿

shozi3
shozi3

スコア691

answer CHANGED
@@ -14,19 +14,16 @@
14
14
 
15
15
  // 西暦1年1月1日からの経過日数を返す
16
16
  int getDays(date_t dt) {
17
- static const int mdays[] = {
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 prev = dt.year - 1,
24
+ int yprev = dt.year - 1,
24
- ydays = prev * 365 + prev / 4 - prev / 100 + prev / 400;
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
- return ydays + mdays[dt.month - 1] + dt.day;
26
+ return ydays + mdays[dt.month - 1] + dt.day;
29
- }
30
27
  }
31
28
 
32
29
  // エントリーポイント

2

コード修正

2018/12/24 00:36

投稿

shozi3
shozi3

スコア691

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
- daysTo - daysFrom + 1 );
57
+ getDays(dtTo[i]) - getDays(dtFrom[i]) + 1 );
61
58
  }
62
59
 
63
60
  return 0;

1

コード修正

2018/12/23 05:42

投稿

shozi3
shozi3

スコア691

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, days = 0,
23
+ int prev = dt.year - 1,
19
24
  ydays = prev * 365 + prev / 4 - prev / 100 + prev / 400;
20
- if (dt.year % 4 == 0 && dt.year % 100 != 0 || dt.year % 400 == 0) {
25
+ if (isLeapYear(dt.year)) {
21
- days = ydays + mdays_leap[dt.month - 1] + dt.day;
26
+ return ydays + mdays_leap[dt.month - 1] + dt.day;
22
27
  } else {
23
- days = ydays + mdays[dt.month - 1] + dt.day;
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
- int daysTo = getDays(dtTo[i]);
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,