回答編集履歴

1

考え方。

2016/03/07 09:07

投稿

fuzzball
fuzzball

スコア16731

test CHANGED
@@ -1 +1,121 @@
1
1
  minuteとsecondはfmodを使っているのに、なぜhourでは使わないのですか?
2
+
3
+
4
+
5
+ #基本的な考え方
6
+
7
+
8
+
9
+ 例えば、10万秒について考えてみます。
10
+
11
+
12
+
13
+ 10万秒は何日か?
14
+
15
+ 10万秒を1日の秒数で割ります。
16
+
17
+ 1日の秒数 = 60*60*24
18
+
19
+ 100000 / (60*60*24) = 1.157...
20
+
21
+ 整数部だけ取り出して「1日」となります。
22
+
23
+ 元の10万秒から「1日」の秒数を引きます。
24
+
25
+ 100000 - (60*60*24)*1 = 13600
26
+
27
+
28
+
29
+ 次は時間です。
30
+
31
+ 13600秒は何時間か?
32
+
33
+ 13600秒を1時間の秒数で割ります。
34
+
35
+ 1時間の秒数 = 60*60
36
+
37
+ 13600 / (60*60) = 3.777...
38
+
39
+ 整数部だけ取り出して「3時間」となります。
40
+
41
+ 元の13600秒から「3時間」の秒数を引きます。
42
+
43
+ 13600 - (60*60)*3 = 2800
44
+
45
+
46
+
47
+ 次は分です。
48
+
49
+ 2800秒は何分か?
50
+
51
+ 2800秒を1分の秒数で割ります。
52
+
53
+ 1分の秒数 = 60
54
+
55
+ 2800 / 60 = 46.666...
56
+
57
+ 整数部だけ取り出して「46分」となります。
58
+
59
+ 元の2800秒から「46分」の秒数を引きます。
60
+
61
+ 2800 - 60*46 = 40
62
+
63
+
64
+
65
+ 次は秒です。
66
+
67
+ 残っている40秒をそのまま使います。
68
+
69
+
70
+
71
+ ということで、10万秒 = 1日3時間46分40秒 となります。
72
+
73
+
74
+
75
+ これをそのままコードにすると、
76
+
77
+
78
+
79
+ ```objectivec
80
+
81
+ int t = [NSDate timeIntervalSinceReferenceDate] - start_time;
82
+
83
+
84
+
85
+ //何日か?
86
+
87
+ int d = t / (60*60*24);
88
+
89
+ t -= d * (60*60*24);
90
+
91
+
92
+
93
+ //何時間か?
94
+
95
+ int h = t / (60*60);
96
+
97
+ t -= h * (60*60);
98
+
99
+
100
+
101
+ //何分か?
102
+
103
+ int m = t / 60;
104
+
105
+ t -= m * 60;
106
+
107
+
108
+
109
+ //何秒か?
110
+
111
+ int s = t;
112
+
113
+ ```
114
+
115
+
116
+
117
+ んでもって、これをカッコ良く仕上げるとhirahasuさんの書いたコードになります。
118
+
119
+ (途中で引き算をする代わりにfmod(整数なら%演算子)を使う)
120
+
121
+