|
|
import java.text.DecimalFormat;
|
|
|
import java.util.Random;
|
|
|
|
|
|
public class MiddleSchoolProblemGenerator extends AbstractProblemGenerator {
|
|
|
public MiddleSchoolProblemGenerator(Random random, DecimalFormat df) {
|
|
|
super(random, df);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public MathProblem generate() {
|
|
|
int operandCount = random.nextInt(3) + 3; // 3-5 个操作数
|
|
|
int[] operands = new int[operandCount];
|
|
|
String[] selectedOperators = new String[operandCount - 1];
|
|
|
String[] displayOperands = new String[operandCount];
|
|
|
String[] operatorPool = {"+", "-", "*", "/"};
|
|
|
|
|
|
for (int i = 0; i < operandCount; i++) {
|
|
|
operands[i] = random.nextInt(100) + 1;
|
|
|
displayOperands[i] = String.valueOf(operands[i]);
|
|
|
}
|
|
|
for (int i = 0; i < operandCount - 1; i++) {
|
|
|
selectedOperators[i] = operatorPool[random.nextInt(operatorPool.length)];
|
|
|
}
|
|
|
|
|
|
// 平方或根号
|
|
|
int specialOperandIndex = random.nextInt(operandCount);
|
|
|
boolean useSquareRoot = random.nextBoolean();
|
|
|
if (useSquareRoot) {
|
|
|
int base = random.nextInt(24) + 2; //2-25
|
|
|
int perfectSquare = base * base;
|
|
|
operands[specialOperandIndex] = base; // √(base^2) = base
|
|
|
displayOperands[specialOperandIndex] = "√" + perfectSquare;
|
|
|
} else {
|
|
|
int base = random.nextInt(9) + 2; // 2-10
|
|
|
int square = base * base;
|
|
|
operands[specialOperandIndex] = square;
|
|
|
displayOperands[specialOperandIndex] = base + "²";
|
|
|
}
|
|
|
|
|
|
// 括号选择
|
|
|
boolean addedBracket = false;
|
|
|
int bracketStartIndex = findBracketStart(toDoubleArray(operands), selectedOperators, 0.3);
|
|
|
String expression;
|
|
|
double result;
|
|
|
if (bracketStartIndex != -1) {
|
|
|
// 构建带括号(显示用 displayOperands)
|
|
|
StringBuilder expressionBuilder = new StringBuilder();
|
|
|
for (int i = 0; i < operandCount; i++) {
|
|
|
if (i == bracketStartIndex) expressionBuilder.append("(");
|
|
|
expressionBuilder.append(displayOperands[i]);
|
|
|
if (i == bracketStartIndex + 1) expressionBuilder.append(")");
|
|
|
if (i < operandCount - 1) expressionBuilder.append(" ").append(selectedOperators[i]).append(" ");
|
|
|
}
|
|
|
expression = expressionBuilder.toString();
|
|
|
result = evaluateExpressionWithBrackets(operands, selectedOperators, bracketStartIndex);
|
|
|
} else {
|
|
|
StringBuilder expressionBuilder = new StringBuilder();
|
|
|
expressionBuilder.append(displayOperands[0]);
|
|
|
result = operands[0];
|
|
|
for (int i = 0; i < operandCount - 1; i++) {
|
|
|
expressionBuilder.append(" ").append(selectedOperators[i]).append(" ").append(displayOperands[i + 1]);
|
|
|
result = applyOperator(result, operands[i + 1], selectedOperators[i]);
|
|
|
}
|
|
|
expression = expressionBuilder.toString();
|
|
|
}
|
|
|
|
|
|
return new MathProblem(expression, df.format(result), "初中");
|
|
|
}
|
|
|
} |