我正在编写一个程序,该程序接受4个数字作为输入,然后尝试查看加减乘除和四个数字相乘的组合是否可以使它们等于24。我的方法是为四个可能的每种组合创建一个方法数字和四个操作数,这有点冗长。这是2种方法的示例。

public static boolean add(int a, int b, int c, int d){
    boolean adBool;
    adBool = a + b + c + d == 24;
    return adBool;
}
public static boolean sub1(int a, int b, int c, int d){
    boolean subBool1;
    subBool1 = a - b - c - d == 24;
    return subBool1;
}

然后在我的Main中,为每个方法都创建一个while循环,如果该方法返回true,则将打印其停止的方法即解决方案。这是一个例子。
while (add(num1, num2, num3, num4)){
            System.out.println("Your solution is " + num1 + " + " + num2 + " + " + num3 + " + " + num4 + " = 24\nCongratulations!");
            break;

        }
        while (sub1(num1, num2, num3, num4)){
            System.out.println("Your solution is " + num1 + " - " + num2 + " - " + num3 + " - " + num4 + " = 24\nCongratulations!");
            break;
        }

有没有一种方法可以存储+和-等操作数,这样我就可以将它们放入数组中,并仅使用一些嵌套的for循环来编写此内容?

最佳答案

假设操作数是固定的,则可以创建一个生成器,该生成器将可能的运算符转储出去,并将其传递给评估器以确定它们是否为真。

while (generator.hasNext()){
    Operators ops = generator.getNext();
    if evaluatesTo(operand1, operand2, operand3, operand4, 24, ops){
       // print it
    }
}

一个简单的生成器可以像这样完成:
List<String> list = new ArrayList<String>();
list.add("+++");
list.add("++-");
...
Iterator generator = list.iterator();

其中generator实现了java.util.Iterator接口(interface),该接口(interface)使用所有运算符(+-*/)进行初始化,并转储大小为3的所有排列。

evalutesTo方法只计算它:
public boolean (int operand1, int operand2, int operand3, int operand4, int total, Operators ops ){
    // calculate operand1 "ops.get(0)" operand2 "ops.get(1)" operand3 "ops.get(2)" operand4  == total
}

因此,如果ops为[+-/],它将检查
if (operand1 + operand2 - operand3 / operand4 == 24) return true;

我应该补充一点,您以后可以添加各种效率,但您有一个问题,那就是如何通过更好的策略来做到这一点。关于其他用户的详细信息,有一些评论,但是我现在不必担心。首先,您需要建立这种框架,然后您可以担心细节。对此最关键的是,您不需要制作数百个外观相似的方法。

09-06 17:45