回答編集履歴

4

終了の仕方を追加

2020/04/14 13:41

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -237,3 +237,27 @@
237
237
  ```
238
238
 
239
239
  入力は、Scanner ではなく、BufferedReader にしました。
240
+
241
+
242
+
243
+ **追記**
244
+
245
+ プログラムの終了の仕方が分からないそうですが、コードを見てください。
246
+
247
+
248
+
249
+ while ((line = br.readLine()) != null) {
250
+
251
+ これは、readLine() で 1行読み込んで、それを line に入れる。
252
+
253
+ line に文字列が入ったらそれは null ではないので、ループの中に入ります。
254
+
255
+ 1行読み込むことが出来なかったら line には null が入り、ループを終了します。
256
+
257
+
258
+
259
+ キーボード入力で、「入力はもう無いよ。終わりだよ」ということを
260
+
261
+ プログラムに伝えるためには、Linux では Ctrl-D、
262
+
263
+ Windows では Ctrl-Z と Enter のキーを押します。

3

compareTo(BigDecimal.ZERO) を signum() に変更

2020/04/14 13:41

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -206,9 +206,9 @@
206
206
 
207
207
  public static String getMoney(BigDecimal money) {
208
208
 
209
- if (money.compareTo(BigDecimal.ZERO) < 0) return "ERROR";
209
+ if (money.signum() < 0) return "ERROR";
210
-
210
+
211
- if (money.compareTo(BigDecimal.ZERO) == 0) return "ZERO";
211
+ if (money.signum() == 0) return "ZERO";
212
212
 
213
213
  String type = "", sep = "";
214
214
 

2

double ではなく、BigDecimal を使う方法を追加

2020/04/14 04:59

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -109,3 +109,131 @@
109
109
  ```
110
110
 
111
111
  double の 0.01、0.05、0.10 は誤差を含むので正しくない出力になる可能性があります。
112
+
113
+
114
+
115
+ **追記**
116
+
117
+ 15.49;16.00
118
+
119
+ HALF DOLLAR
120
+
121
+
122
+
123
+ やはり double による誤差が出てしまいました。
124
+
125
+
126
+
127
+ 正しくは、
128
+
129
+ 15.49;16.00
130
+
131
+ HALF DOLLAR,PENNY
132
+
133
+
134
+
135
+ やはり BigDecimal を使うことにしました。
136
+
137
+ ```Java
138
+
139
+ package douteki;
140
+
141
+
142
+
143
+ import java.io.IOException;
144
+
145
+ import java.io.InputStreamReader;
146
+
147
+ import java.io.BufferedReader;
148
+
149
+ import java.math.BigDecimal;
150
+
151
+ import java.nio.charset.StandardCharsets;
152
+
153
+
154
+
155
+ public class Main {
156
+
157
+ public static void main(String[] args) throws IOException {
158
+
159
+ InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
160
+
161
+ BufferedReader in = new BufferedReader(reader);
162
+
163
+ String line;
164
+
165
+ while ((line = in.readLine()) != null) {
166
+
167
+ String[] n = line.split(";", 0);
168
+
169
+ BigDecimal val1 = new BigDecimal(n[0]);
170
+
171
+ BigDecimal val2 = new BigDecimal(n[1]);
172
+
173
+ System.out.println(getMoney(val2.subtract(val1)));
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ public static final BigDecimal[] types = {
182
+
183
+ new BigDecimal("100.00"), new BigDecimal("50.00"),
184
+
185
+ new BigDecimal("20.00"), new BigDecimal("10.00"),
186
+
187
+ new BigDecimal("5.00"), new BigDecimal("2.00"),
188
+
189
+ new BigDecimal("1.00"), new BigDecimal( "0.50"),
190
+
191
+ new BigDecimal("0.25"), new BigDecimal("0.10"),
192
+
193
+ new BigDecimal("0.05"), new BigDecimal("0.01")
194
+
195
+ };
196
+
197
+ public static final String[] names = {
198
+
199
+ "ONE HUNDRED", "FIFTY", "TWENTY", "TEN", "FIVE", "TWO", "ONE",
200
+
201
+ "HALF DOLLAR", "QUARTER", "DIME", "NICKEL", "PENNY"
202
+
203
+ };
204
+
205
+
206
+
207
+ public static String getMoney(BigDecimal money) {
208
+
209
+ if (money.compareTo(BigDecimal.ZERO) < 0) return "ERROR";
210
+
211
+ if (money.compareTo(BigDecimal.ZERO) == 0) return "ZERO";
212
+
213
+ String type = "", sep = "";
214
+
215
+ for (int i = 0; i < types.length; i++) {
216
+
217
+ if (money.compareTo(types[i]) >= 0) {
218
+
219
+ BigDecimal[] n = money.divideAndRemainder(types[i]);
220
+
221
+ money = n[1];
222
+
223
+ type += sep + names[i];
224
+
225
+ sep = ",";
226
+
227
+ }
228
+
229
+ }
230
+
231
+ return type;
232
+
233
+ }
234
+
235
+ }
236
+
237
+ ```
238
+
239
+ 入力は、Scanner ではなく、BufferedReader にしました。

1

語句修正

2020/04/14 03:43

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -70,7 +70,7 @@
70
70
 
71
71
  money %= value[i];
72
72
 
73
- str += sep +name[i];
73
+ str += sep + name[i];
74
74
 
75
75
  sep = ",";
76
76
 
@@ -108,4 +108,4 @@
108
108
 
109
109
  ```
110
110
 
111
- double の 0.01、0.05、0.10 は誤差を含むので正しくない出力が出る可能性があります。
111
+ double の 0.01、0.05、0.10 は誤差を含むので正しくない出力になる可能性があります。