0

对于我的程序,我需要生成具有可定制复杂性的有效中缀表达式。问题是我想不出一种方法来防止除以零、浮点答案和否定答案。

为了防止否定答案,我采取了一种肮脏的方法。也就是说,生成一个表达式,对其进行评估,如果结果为负,则再次生成。这里有一些你应该知道的事情:

  1. inToPost() 是一种将生成的中缀表达式转换为后缀进行求值的方法。
  2. complexLevel <= DIVIDE 意味着我们不应该在表达式中加上括号。
  3. complexLevel == ARITHMETIC_PARENTHESIS 意味着包含括号。

我怎样才能确保a)没有除以零b)没有除法导致浮点(想出一个肮脏的方法来做到这一点)c)最终结果不是负数这是代码

public void generateRandom(int operandLimit, int operatorCount, int complexityLevel) {
        Random rand = new Random();
        infix.clear();

        int i = 0;
        infix.add( rand.nextInt(operandLimit) + 1 );

        while(i < operatorCount) {
            int operator;
            if(complexityLevel <= DIVIDE)
                operator = rand.nextInt(complexityLevel - 1)*1000 + 1000;
            else
                operator = rand.nextInt(complexityLevel - 3)*1000 + 1000;

            int operand = rand.nextInt(operandLimit) + 1;

            if( operator == Operator.DIVIDE ) {
                int lastNum = infix.get(infix.size() - 1);

                if( lastNum < operand) {
                    int temp = operand;
                    operand = lastNum;
                    lastNum = temp;
                }

                lastNum -= lastNum % operand;
                infix.set(infix.size() - 1, lastNum);
            }

            infix.add( operator );
            infix.add( operand );

            ++i;
        }

        if(complexityLevel == ARITMETIC_PARENTHESIS) {
            int braceOpen = rand.nextInt( operatorCount ) * 2;
            infix.add(braceOpen, Operator.BR_OPEN );
            infix.add(braceOpen + 4, Operator.BR_CLOSE);
        }

        inToPost();
        if(evaluate() < 0)
            generateRandom(operandLimit, operatorCount, complexityLevel);
    }
4

1 回答 1

0

看起来您已经处理了您的条件 (b) 和 (c)。由于您的操作数永远不会为 0,我猜想唯一可能违反 (a) 的情况是,如果添加的括号碰巧包装了一个零值,而在此之前的运算符是一个除法。如果您修改您的子表达式,您可以检查这种情况inToPost()

if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
        evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) {
    // Put parentheses elsewhere, or cancel
}
于 2012-03-23T17:34:27.420 回答