@ -0,0 +1,67 @@
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Random;
|
||||
|
||||
public class ElementaryProblemGenerator extends AbstractProblemGenerator {
|
||||
public ElementaryProblemGenerator(Random random, DecimalFormat df) {
|
||||
super(random, df);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MathProblem generate() {
|
||||
// 小学题目要求:答案不得为负数。最多尝试若干次生成,若仍为负则回退到简单加法题。
|
||||
int maxAttempts = 50;
|
||||
for (int attempt = 0; attempt < maxAttempts; attempt++) {
|
||||
int operandCount = random.nextInt(4) + 2; // 2-5个操作数
|
||||
String[] operators = {"+", "-", "*", "/"};
|
||||
int[] operands = new int[operandCount];
|
||||
String[] selectedOperators = new String[operandCount - 1];
|
||||
for (int i = 0; i < operandCount; i++) operands[i] = random.nextInt(100) + 1;
|
||||
// 运算符选择(避免连乘/连除,调整概率)
|
||||
String previousOperator = null;
|
||||
double pPlus = 0.45, pMinus = 0.35, pTimes = 0.15, pDivide = 0.05;
|
||||
for (int i = 0; i < operandCount - 1; i++) {
|
||||
String operator;
|
||||
if ("*".equals(previousOperator) || "/".equals(previousOperator)) {
|
||||
double randValue = random.nextDouble();
|
||||
double total = pPlus + pMinus;
|
||||
operator = randValue < (pPlus / total) ? "+" : "-";
|
||||
} else {
|
||||
double randValue = random.nextDouble();
|
||||
if (randValue < pPlus) operator = "+";
|
||||
else if (randValue < pPlus + pMinus) operator = "-";
|
||||
else if (randValue < pPlus + pMinus + pTimes) operator = "*";
|
||||
else operator = "/";
|
||||
}
|
||||
selectedOperators[i] = operator;
|
||||
previousOperator = operator;
|
||||
}
|
||||
// 括号选择
|
||||
int startPos = findBracketStart(toDoubleArray(operands), selectedOperators, 0.3);
|
||||
String expression;
|
||||
double result;
|
||||
if (startPos != -1) {
|
||||
expression = buildExpressionWithBrackets(operands, selectedOperators, startPos);
|
||||
result = evaluateExpressionWithBrackets(operands, selectedOperators, startPos);
|
||||
} else {
|
||||
StringBuilder expBuilder = new StringBuilder();
|
||||
expBuilder.append(operands[0]);
|
||||
result = operands[0];
|
||||
for (int i = 0; i < operandCount - 1; i++) {
|
||||
expBuilder.append(" ").append(selectedOperators[i]).append(" ").append(operands[i + 1]);
|
||||
result = applyOperator(result, operands[i + 1], selectedOperators[i]);
|
||||
}
|
||||
expression = expBuilder.toString();
|
||||
}
|
||||
if (result >= 0) {
|
||||
return new MathProblem(expression, df.format(result), "小学");
|
||||
}
|
||||
// 如果为负数,继续下一次尝试
|
||||
}
|
||||
// 回退:生成一个保证非负的简单加法题
|
||||
int a = random.nextInt(100) + 1;
|
||||
int b = random.nextInt(100) + 1;
|
||||
String expression = a + " + " + b;
|
||||
double result = a + b;
|
||||
return new MathProblem(expression, df.format(result), "小学");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue