回答編集履歴

1

別解を追加

2020/12/13 06:13

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  class Main {
14
14
 
15
- public static void main (String[] args) {
15
+ public static void main(String[] args) {
16
16
 
17
17
  Scanner sc = new Scanner(System.in);
18
18
 
@@ -105,3 +105,147 @@
105
105
  演算は左から順に実行。
106
106
 
107
107
  割り算は整数の除算(小数点以下切り捨て)。
108
+
109
+
110
+
111
+ **追記**
112
+
113
+ ビット演算を使うと、 forの三重ループがひとつの for文になります。
114
+
115
+ ```Java
116
+
117
+ for (int i = 0; i < 1<<6; i++) {
118
+
119
+ int[] op = { i>>4 & 3, i >>2 & 3, i & 3 };
120
+
121
+ if (calc(num, op) == result) print(num, op, result);
122
+
123
+ }
124
+
125
+ ```
126
+
127
+ あるいは、 forの三重ループのところで計算をすると、計算回数が減らせます。
128
+
129
+ ```Java
130
+
131
+ for (op[0] = 0; op[0] < 4; op[0]++) {
132
+
133
+ int a = calc(num[0], op[0], num[1]);
134
+
135
+ for (op[1] = 0; op[1] < 4; op[1]++) {
136
+
137
+ int b = calc(a, op[1], num[2]);
138
+
139
+ for (op[2] = 0; op[2] < 4; op[2]++)
140
+
141
+ if (calc(b, op[2], num[3]) == result)
142
+
143
+ print(num, op, result);
144
+
145
+ }
146
+
147
+ }
148
+
149
+
150
+
151
+ private static int calc(int a, int op, int b) {
152
+
153
+ switch (op) {
154
+
155
+ case 0: return a + b;
156
+
157
+ case 1: return a - b;
158
+
159
+ case 2: return a * b;
160
+
161
+ case 3: if (b != 0) return a / b;
162
+
163
+ }
164
+
165
+ return 999999999;
166
+
167
+ }
168
+
169
+ ```
170
+
171
+ switch文を使わないやり方も考えられます。
172
+
173
+ ```Java
174
+
175
+ import java.util.Scanner;
176
+
177
+
178
+
179
+ class Main {
180
+
181
+ public static void main(String[] args) {
182
+
183
+ Scanner sc = new Scanner(System.in);
184
+
185
+ System.out.println("4桁の数字を入力してください");
186
+
187
+ String number = sc.next();
188
+
189
+ int[] num = new int[4];
190
+
191
+ for (int i = 0; i < 4; i++) num[i] = number.charAt(i) - '0';
192
+
193
+ System.out.println("計算値にしたい数字を入力してください");
194
+
195
+ int result = sc.nextInt();
196
+
197
+ int[] op = new int[4];
198
+
199
+ Calc[] calc = { new Add(), new Sub(), new Mul(), new Div() };
200
+
201
+ for (op[0] = 0; op[0] < 4; op[0]++) {
202
+
203
+ int a = calc[op[0]].exec(num[0], num[1]);
204
+
205
+ for (op[1] = 0; op[1] < 4; op[1]++) {
206
+
207
+ int b = calc[op[1]].exec(a, num[2]);
208
+
209
+ for (op[2] = 0; op[2] < 4; op[2]++)
210
+
211
+ if (calc[op[2]].exec(b, num[3]) == result)
212
+
213
+ print(num, op, result);
214
+
215
+ }
216
+
217
+ }
218
+
219
+ }
220
+
221
+
222
+
223
+ private static void print(int[] num, int[] op, int result) {
224
+
225
+ final String[] name = { "+", "-", "*", "/" };
226
+
227
+ System.out.println(num[0] + name[op[0]] + num[1]
228
+
229
+ + name[op[1]] + num[2] + name[op[2]] + num[3] + " = " + result);
230
+
231
+ }
232
+
233
+ }
234
+
235
+
236
+
237
+ class Calc { int exec(int a, int b) { return 0; } }
238
+
239
+ class Add extends Calc { int exec(int a, int b) { return a + b; } }
240
+
241
+ class Sub extends Calc { int exec(int a, int b) { return a - b; } }
242
+
243
+ class Mul extends Calc { int exec(int a, int b) { return a * b; } }
244
+
245
+ class Div extends Calc {
246
+
247
+ int exec(int a, int b) { return b != 0 ? a / b : 999999999; }
248
+
249
+ }
250
+
251
+ ```