これは最速の解決策ではなく、有益な解決策です。
- 後置記法ですべての方程式を再帰的に生成します
- また、後置記法から中置記法への変換も提供します
- 実際の算術計算は行われないため、独自に実装する必要があります
4 つのオペランド、4 つの可能な演算子を使用すると、すべて 7680 = 5 * 4 が生成されます。* 4^3 の可能な表現。
- 5はカタロニア語(3)です。Catalan(N) は、N+1 オペランドを括弧で囲む方法の数です。
- 4!4つのオペランドは置換可能であるため
- 4^3 は、3 人のオペレーターがそれぞれ 4 つの選択肢を持っているためです。
N オペランドの式の数は [1, 8, 192, 7680, 430080, 30965760, 2724986880, ...] であるため、これは間違いなくうまくスケーリングしません。
一般に、オペランドがあり、可能性から選択した演算子n+1
を挿入する必要がある場合、可能性のある方程式があります。n
k
(2n)!/n! k^n
幸運を!
import java.util.*;
public class Expressions {
static String operators = "+-/*";
static String translate(String postfix) {
Stack<String> expr = new Stack<String>();
Scanner sc = new Scanner(postfix);
while (sc.hasNext()) {
String t = sc.next();
if (operators.indexOf(t) == -1) {
expr.push(t);
} else {
expr.push("(" + expr.pop() + t + expr.pop() + ")");
}
}
return expr.pop();
}
static void brute(Integer[] numbers, int stackHeight, String eq) {
if (stackHeight >= 2) {
for (char op : operators.toCharArray()) {
brute(numbers, stackHeight - 1, eq + " " + op);
}
}
boolean allUsedUp = true;
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] != null) {
allUsedUp = false;
Integer n = numbers[i];
numbers[i] = null;
brute(numbers, stackHeight + 1, eq + " " + n);
numbers[i] = n;
}
}
if (allUsedUp && stackHeight == 1) {
System.out.println(eq + " === " + translate(eq));
}
}
static void expression(Integer... numbers) {
brute(numbers, 0, "");
}
public static void main(String args[]) {
expression(1, 2, 3, 4);
}
}