回答編集履歴
1
別解を追加
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
import java.util.Scanner;
|
6
6
|
|
7
7
|
class Main {
|
8
|
-
public static void main
|
8
|
+
public static void main(String[] args) {
|
9
9
|
Scanner sc = new Scanner(System.in);
|
10
10
|
System.out.println("4桁の数字を入力してください");
|
11
11
|
String number = sc.next();
|
@@ -51,4 +51,76 @@
|
|
51
51
|
```
|
52
52
|
|
53
53
|
演算は左から順に実行。
|
54
|
-
割り算は整数の除算(小数点以下切り捨て)。
|
54
|
+
割り算は整数の除算(小数点以下切り捨て)。
|
55
|
+
|
56
|
+
**追記**
|
57
|
+
ビット演算を使うと、 forの三重ループがひとつの for文になります。
|
58
|
+
```Java
|
59
|
+
for (int i = 0; i < 1<<6; i++) {
|
60
|
+
int[] op = { i>>4 & 3, i >>2 & 3, i & 3 };
|
61
|
+
if (calc(num, op) == result) print(num, op, result);
|
62
|
+
}
|
63
|
+
```
|
64
|
+
あるいは、 forの三重ループのところで計算をすると、計算回数が減らせます。
|
65
|
+
```Java
|
66
|
+
for (op[0] = 0; op[0] < 4; op[0]++) {
|
67
|
+
int a = calc(num[0], op[0], num[1]);
|
68
|
+
for (op[1] = 0; op[1] < 4; op[1]++) {
|
69
|
+
int b = calc(a, op[1], num[2]);
|
70
|
+
for (op[2] = 0; op[2] < 4; op[2]++)
|
71
|
+
if (calc(b, op[2], num[3]) == result)
|
72
|
+
print(num, op, result);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
private static int calc(int a, int op, int b) {
|
77
|
+
switch (op) {
|
78
|
+
case 0: return a + b;
|
79
|
+
case 1: return a - b;
|
80
|
+
case 2: return a * b;
|
81
|
+
case 3: if (b != 0) return a / b;
|
82
|
+
}
|
83
|
+
return 999999999;
|
84
|
+
}
|
85
|
+
```
|
86
|
+
switch文を使わないやり方も考えられます。
|
87
|
+
```Java
|
88
|
+
import java.util.Scanner;
|
89
|
+
|
90
|
+
class Main {
|
91
|
+
public static void main(String[] args) {
|
92
|
+
Scanner sc = new Scanner(System.in);
|
93
|
+
System.out.println("4桁の数字を入力してください");
|
94
|
+
String number = sc.next();
|
95
|
+
int[] num = new int[4];
|
96
|
+
for (int i = 0; i < 4; i++) num[i] = number.charAt(i) - '0';
|
97
|
+
System.out.println("計算値にしたい数字を入力してください");
|
98
|
+
int result = sc.nextInt();
|
99
|
+
int[] op = new int[4];
|
100
|
+
Calc[] calc = { new Add(), new Sub(), new Mul(), new Div() };
|
101
|
+
for (op[0] = 0; op[0] < 4; op[0]++) {
|
102
|
+
int a = calc[op[0]].exec(num[0], num[1]);
|
103
|
+
for (op[1] = 0; op[1] < 4; op[1]++) {
|
104
|
+
int b = calc[op[1]].exec(a, num[2]);
|
105
|
+
for (op[2] = 0; op[2] < 4; op[2]++)
|
106
|
+
if (calc[op[2]].exec(b, num[3]) == result)
|
107
|
+
print(num, op, result);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
private static void print(int[] num, int[] op, int result) {
|
113
|
+
final String[] name = { "+", "-", "*", "/" };
|
114
|
+
System.out.println(num[0] + name[op[0]] + num[1]
|
115
|
+
+ name[op[1]] + num[2] + name[op[2]] + num[3] + " = " + result);
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
class Calc { int exec(int a, int b) { return 0; } }
|
120
|
+
class Add extends Calc { int exec(int a, int b) { return a + b; } }
|
121
|
+
class Sub extends Calc { int exec(int a, int b) { return a - b; } }
|
122
|
+
class Mul extends Calc { int exec(int a, int b) { return a * b; } }
|
123
|
+
class Div extends Calc {
|
124
|
+
int exec(int a, int b) { return b != 0 ? a / b : 999999999; }
|
125
|
+
}
|
126
|
+
```
|