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

回答編集履歴

1

別解を追加

2020/12/13 06:13

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  import java.util.Scanner;
6
6
 
7
7
  class Main {
8
- public static void main (String[] args) {
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
+ ```