随机生成有效的中缀算术表达式

时间:2012-03-23 17:04:20

标签: math expression infix-notation

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

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

  1. inToPost()是一种将生成的中缀表达式转换为后缀以进行评估的方法。
  2. complexityLevel< = DIVIDE意味着我们不应该在表达式中加上括号。
  3. complexityLevel == ARITHMETIC_PARENTHESIS意味着包括括号。
  4. 如何确保 a)没有划分为零 b)没有划分导致浮点(弄清楚这样做的方法)< strong> 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);
        }
    

1 个答案:

答案 0 :(得分: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
}