回答編集履歴
1
別解を追加
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
class Main {
|
14
14
|
|
15
|
-
public static void main
|
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
|
+
```
|