检查所有可能的表达式,它们等于给定4个整数的某个数字?

时间:2014-12-03 21:12:41

标签: java

大家好,我真的很感激我的计划有任何帮助。在这个程序中,我必须要求用户输入4个整数,并且我必须输出一个可能的表达式(在众多中)等于24.如果没有这样的解决方案,我必须告诉用户。到目前为止,这就是我所拥有的:

import java.util.Scanner;

public class Game24 {

    public static void main(String[] args) {
        System.out.println("Enter 4 numbers and hit enter after each number: ");
        Scanner input = new Scanner(System.in);
        String num1 = input.nextLine();
        String num2 = input.nextLine();
        String num3 = input.nextLine();
        String num4 = input.nextLine();
        StringPermutation("", num1 + "+" + num2 + "*" + num3 + "/" + num4 + "(" + ")");
    }

    public static String StringPermutation(String x, String y) {
        double expression = 0;
        int count = 0;

        if (y.length() <= 1) {
            try {
                for (int i = 0; i < y.length(); i++) {
                    String p = y.substring(0, i) + y.substring(i + 1);
                    expression = Double.parseDouble(StringPermutation(x + y.charAt(i), p));
                }

                if (y.length() <= 1 && expression == 24) {
                    do {
                        count++;
                        System.out.println(x + y);
                    } while (count < 1);
                }

                //if (y.length() <= 1 && expression != 24) {
                //    System.out.print("No solution");
                //}
            } catch (Exception e) {}

        } else {
            for (int i = 0; i < y.length(); i++) {
                String p = y.substring(0, i) + y.substring(i + 1);
                StringPermutation(x + y.charAt(i), p);
            }
        }
        return "";
    }
}

所以我试图做的是我将用户输入的所有排列作为字符串。然后将字符串解析为double并检查所有可能的排列以查看它们是否等于24,如果是,我将表达式输出为字符串。但是,这对我来说并不适用;当我运行程序时,没有任何显示。此外,如果我取消注释评论的部分,它不会显示任何内容。

1 个答案:

答案 0 :(得分:0)

以下是一些可能有助于您入门的设计提示:

  1. 您当前转换为字符串然后测试排列的设计很差。它很难理解,容易出错。更好的方法是在计算表达式的结果时构建表达式字符串。
  2. 构建解决方案列表的递归方法的一般形式如下:

    List solutions = new ArrayList&lt;&gt;(); test(partialSolution,startingContext);

    private void test(解决方案currentSolution,Context currentContext){     if(currentContext.isNotEmpty()){         for(每一步){             test(currentSolution.add(step),currentContext.remove(step));         }     } else if(currentSolution.isSuccessful()){         solutions.add(currentSolution);     } }

  3. 在您的情况下,每个步骤&#39;涉及2个排列维度。第一个维度是尝试所有剩余的操作数。在不创建多个数组的情况下,一种简单的方法是始终使用第一个操作数,然后使用连续的数组成员进行切换。第二个维度是每个运算符(* + - /)。这里最简单的事情就是只进行4次测试调用。更完整的抽象是将运算符放在单独的枚举中,但这对你的情况可能有点过分。

  4. 所以这里有一些部分代码可以帮助你入门

    class Expressions {
        private final Set<String> validExpressions = new TreeSet<>();
    
        public Expressions(int expectedResult, int... operands) {
            test("" + operands[0], operands[0], Arrays.copyOfRange(operands, 1, operands.length);
        }
    
        private void test(String currentExpression, int currentResult, int... operands) {
            if (operands.length > 0) {
                ...
            } else if (currentResult == result) {
                 validExpressions.add(expression + " = " + result);
            }
        }
    }