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

回答編集履歴

4

終了の仕方を追加

2020/04/14 13:41

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -117,4 +117,16 @@
117
117
  }
118
118
  }
119
119
  ```
120
- 入力は、Scanner ではなく、BufferedReader にしました。
120
+ 入力は、Scanner ではなく、BufferedReader にしました。
121
+
122
+ **追記**
123
+ プログラムの終了の仕方が分からないそうですが、コードを見てください。
124
+
125
+ while ((line = br.readLine()) != null) {
126
+ これは、readLine() で 1行読み込んで、それを line に入れる。
127
+ line に文字列が入ったらそれは null ではないので、ループの中に入ります。
128
+ 1行読み込むことが出来なかったら line には null が入り、ループを終了します。
129
+
130
+ キーボード入力で、「入力はもう無いよ。終わりだよ」ということを
131
+ プログラムに伝えるためには、Linux では Ctrl-D、
132
+ Windows では Ctrl-Z と Enter のキーを押します。

3

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

2020/04/14 13:41

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -102,8 +102,8 @@
102
102
  };
103
103
 
104
104
  public static String getMoney(BigDecimal money) {
105
- if (money.compareTo(BigDecimal.ZERO) < 0) return "ERROR";
105
+ if (money.signum() < 0) return "ERROR";
106
- if (money.compareTo(BigDecimal.ZERO) == 0) return "ZERO";
106
+ if (money.signum() == 0) return "ZERO";
107
107
  String type = "", sep = "";
108
108
  for (int i = 0; i < types.length; i++) {
109
109
  if (money.compareTo(types[i]) >= 0) {

2

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

2020/04/14 04:59

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -53,4 +53,68 @@
53
53
  FIVE
54
54
  ^Z
55
55
  ```
56
- double の 0.01、0.05、0.10 は誤差を含むので正しくない出力になる可能性があります。
56
+ double の 0.01、0.05、0.10 は誤差を含むので正しくない出力になる可能性があります。
57
+
58
+ **追記**
59
+ 15.49;16.00
60
+ HALF DOLLAR
61
+
62
+ やはり double による誤差が出てしまいました。
63
+
64
+ 正しくは、
65
+ 15.49;16.00
66
+ HALF DOLLAR,PENNY
67
+
68
+ やはり BigDecimal を使うことにしました。
69
+ ```Java
70
+ package douteki;
71
+
72
+ import java.io.IOException;
73
+ import java.io.InputStreamReader;
74
+ import java.io.BufferedReader;
75
+ import java.math.BigDecimal;
76
+ import java.nio.charset.StandardCharsets;
77
+
78
+ public class Main {
79
+ public static void main(String[] args) throws IOException {
80
+ InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
81
+ BufferedReader in = new BufferedReader(reader);
82
+ String line;
83
+ while ((line = in.readLine()) != null) {
84
+ String[] n = line.split(";", 0);
85
+ BigDecimal val1 = new BigDecimal(n[0]);
86
+ BigDecimal val2 = new BigDecimal(n[1]);
87
+ System.out.println(getMoney(val2.subtract(val1)));
88
+ }
89
+ }
90
+
91
+ public static final BigDecimal[] types = {
92
+ new BigDecimal("100.00"), new BigDecimal("50.00"),
93
+ new BigDecimal("20.00"), new BigDecimal("10.00"),
94
+ new BigDecimal("5.00"), new BigDecimal("2.00"),
95
+ new BigDecimal("1.00"), new BigDecimal( "0.50"),
96
+ new BigDecimal("0.25"), new BigDecimal("0.10"),
97
+ new BigDecimal("0.05"), new BigDecimal("0.01")
98
+ };
99
+ public static final String[] names = {
100
+ "ONE HUNDRED", "FIFTY", "TWENTY", "TEN", "FIVE", "TWO", "ONE",
101
+ "HALF DOLLAR", "QUARTER", "DIME", "NICKEL", "PENNY"
102
+ };
103
+
104
+ public static String getMoney(BigDecimal money) {
105
+ if (money.compareTo(BigDecimal.ZERO) < 0) return "ERROR";
106
+ if (money.compareTo(BigDecimal.ZERO) == 0) return "ZERO";
107
+ String type = "", sep = "";
108
+ for (int i = 0; i < types.length; i++) {
109
+ if (money.compareTo(types[i]) >= 0) {
110
+ BigDecimal[] n = money.divideAndRemainder(types[i]);
111
+ money = n[1];
112
+ type += sep + names[i];
113
+ sep = ",";
114
+ }
115
+ }
116
+ return type;
117
+ }
118
+ }
119
+ ```
120
+ 入力は、Scanner ではなく、BufferedReader にしました。

1

語句修正

2020/04/14 03:43

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -34,7 +34,7 @@
34
34
  for (int i = 0; i < name.length; i++)
35
35
  if (money >= value[i]) {
36
36
  money %= value[i];
37
- str += sep +name[i];
37
+ str += sep + name[i];
38
38
  sep = ",";
39
39
  }
40
40
  return str;
@@ -53,4 +53,4 @@
53
53
  FIVE
54
54
  ^Z
55
55
  ```
56
- double の 0.01、0.05、0.10 は誤差を含むので正しくない出力が出る可能性があります。
56
+ double の 0.01、0.05、0.10 は誤差を含むので正しくない出力になる可能性があります。