0

问题如下:我需要制作一个 Java 程序,它给你随机数(例如 1 2 3),然后它需要给随机运算符(例如 + *)。

好吧,我已经得到了那个部分,但是我如何用 Java 代码检查那个答案。答案应该是 7。

以下代码是问题所在:

    String operations[] = {"+ ","- ","* ","/ "};
    System.out.println("How many digits?");
    int times = scan.nextInt();
    this.times = times;
    this.operation = new String[times-1];
    this.digits = new int[times];

    for (int i = 0; i < times - 1; i++)
    {
        operation[i] = operations[rand.nextInt(4)];
        System.out.print(operation[i]);
    }

    for(int i = 0; i < operation.length; i++)
    {
        System.out.print(digits[i]+" ");
        System.out.println(digits[i] + operation[i] + digits[i]);         //first digit + - * / the first digit
    }

希望这些片段有点清楚。我想要做的是获得随机数字和运算符。之后我想运行表达式。

希望您能够帮助我。

4

4 回答 4

1

这是一个允许多个操作数并尊重操作顺序的答案,与当前此处的任何其他答案不同。

import java.util.Arrays;
import java.util.List;

public class Expression {
    private List<Integer> operands;
    private List<Character> operators;

    public Expression(List<Integer> operands, List<Character> operators) {
        this.operands = operands;
        this.operators = operators;
    }

    public Expression subExpression(int fromIndex, int toIndex) {
        return new Expression(
                operands.subList(fromIndex, toIndex), 
                operators.subList(fromIndex, toIndex - 1));
    }

    private int rightMost(char operator) {
        return operators.lastIndexOf(operator);
    }

    public double evaluate() {
        if (operands.size() == 1) {
            return operands.get(0).doubleValue();
        }

        if (rightMost('+') > -1){
            return subExpression(0, rightMost('+') + 1).evaluate()
                + subExpression(rightMost('+') + 1, operands.size()).evaluate();  
        }
        if (rightMost('-') > -1){
            return subExpression(0, rightMost('-') + 1).evaluate() 
                - subExpression(rightMost('-') + 1, operands.size()).evaluate();  
        }
        if (rightMost('*') > -1){
            return subExpression(0, rightMost('*') + 1).evaluate() 
                * subExpression(rightMost('*') + 1, operands.size()).evaluate();  
        }
        if (rightMost('/') > -1){
            return subExpression(0, rightMost('/') + 1).evaluate() 
                / subExpression(rightMost('/') + 1, operands.size()).evaluate();  
        }
        return 0;
    }

    @Override
    public String toString() {
        StringBuilder toReturn = new StringBuilder();
        for (int index = 0; index < operands.size(); index++){
        toReturn.append(operands.get(index));
        toReturn.append(" ");
        toReturn.append(
                index == operators.size() ? "=" : operators.get(index));
        toReturn.append(" ");
       }
       toReturn.append(evaluate());
       return toReturn.toString();
    }

    public static Expression makeRandom(
        int minimum, int maximum, int numberOfOperands) {
        Integer[] operands = new Integer[numberOfOperands];
        Character[] operators = new Character[numberOfOperands - 1];
        for (int index = 0; index < numberOfOperands; index++) {
            operands[index] = minimum 
                        + (int)(Math.random() * (maximum - minimum + 1));
        }
        for (int index = 0; index < numberOfOperands - 1; index++) {
            operators[index] = "+-*/".charAt((int)(Math.random() * 4));
        }
        return new Expression(Arrays.asList(operands), Arrays.asList(operators));
    }

    public static void main (String[] args){
        System.out.println(makeRandom(1, 10, 6));
        System.out.println(new Expression(
                Arrays.asList(1, 2, 3), Arrays.asList('+', '*')));
    }
}

main只是为了进行快速而肮脏的测试。这是一次运行的输出。如您所见,1 + 2 * 3给出了正确的答案 - 当前此页面上的其他答案都没有正确答案。

10 / 5 / 6 * 9 + 9 * 1 = 12.0
1 + 2 * 3 = 7.0

我已经evaluate返回double以避免整数除法的任何令人讨厌的惊喜。如有必要,这很容易改变。此外,这里没有错误处理 - 有一些方法应该对其参数进行一些错误处理,并且确实应该做一些关于捕获除以零的事情。

这是通过将表达式拆分为更小的子表达式,递归地评估每个子表达式,然后将它们重新组合在一起来实现的。神奇之处在于evaluate方法中的操作顺序。由于这些原因,必须按此顺序处理不同的运算符。

  • +必须在之前考虑-,以便a - b + c解析为(a - b) + c,而不是a - (b + c)
  • *必须在之前考虑/,以便a / b * c解析为(a / b) * c,而不是a / (b * c)
  • +并且-两者都必须在*和之前考虑/,以便首先评估*和。/
  • 减法必须从右到左进行,因此a - b - c解析为(a - b) - c,而不是a - (b - c)
  • 除法必须从右到左工作,因此a / b / c解析为(a / b) / c,而不是a / (b / c)
  • 加法和乘法可以从左到右或从右到左进行,但是在编写了rightMost方法之后,从右到左进行它们是有意义的。
于 2013-10-22T01:54:36.860 回答
0

您可以使用switch语句并执行以下操作:

switch(operations[i]) {
    case "+": number1 + number2; break;
    case "-": number1 - number2; break;
    case "*": number1 * number2; break;
    case "/": number1 / number2; break;
}
于 2013-10-20T10:36:27.673 回答
0

这将检查您生成的方程式是否为 7

int result = digits[0];
int i=0;

for(i=0;i<times-1;i++)
{
    String operation = operations[i];

    if(operation.equals("+") result += digits[i+1];    
    else if(operation.equals("-") result -= digits[i+1];    
    else if(operation.equals("*") result *= digits[i+1];    
    else if(operation.equals("/") result /= digits[i+1];    
}
if(result==7) System.out.println("You got the correct answer ie 7");
else System.out.println("You got "+result);

编辑:刚刚纠正了一个错字。

于 2013-10-20T10:21:54.433 回答
0

你可以尝试这样的事情:

    String operations[] = {"+", "-", "*", "/"};
    int idx = new Random().nextInt(operations.length);
    String random_operator = "/";
    int int_1 = (int) (Math.random() * 100);
    int int_2 = (int) (Math.random() * 100);

    Scanner s = new Scanner(System.in);
    int result = 0;
    if (random_operator.equals("*")) {
        result = int_1 * int_2;
        System.out.println(int_1 + random_operator + int_2);
    } else if (random_operator.equals("+")) {
        result = int_1 + int_2;

        System.out.println(int_1 + random_operator + int_2);
    } else if (random_operator.equals("-")) {
        if (int_1 < int_2) {
            result = int_2 - int_1;
            System.out.println(int_2 + random_operator + int_1);
        } else {
            System.out.println(int_1 + random_operator + int_2);
            result = int_1 - int_2;
        }


    } else if (random_operator.equals("/")) {
        if (int_1 < int_2) {

            result = int_2 / int_1;
            System.out.println(int_2 + random_operator + int_1);
        } else {
            result = int_1 / int_2;
            System.out.println(int_1 + random_operator + int_2);
        }


    }

    if (s.nextInt() == result) {
        System.out.println("Correct answer");
    } else {
        System.out.println("Wrong answer");
    }

请注意,我在上面的例子中只考虑了整数。

于 2013-10-20T10:45:19.337 回答