对于我的程序,我需要生成具有可定制复杂性的有效中缀表达式。问题是我无法找到一种方法来防止零除,浮点答案和否定答案。
为了防止否定答案,我采取了一种肮脏的方法。也就是说,生成一个表达式,对其进行评估,如果结果是否定的,则再次生成。这是你应该知道的一些事情:
如何确保 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);
}
答案 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
}