对于我的程序,我需要生成具有可定制复杂性的有效中缀表达式。问题是我想不出一种方法来防止除以零、浮点答案和否定答案。
为了防止否定答案,我采取了一种肮脏的方法。也就是说,生成一个表达式,对其进行评估,如果结果为负,则再次生成。这里有一些你应该知道的事情:
- inToPost() 是一种将生成的中缀表达式转换为后缀进行求值的方法。
- complexLevel <= DIVIDE 意味着我们不应该在表达式中加上括号。
- 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);
}