You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
3.2 KiB
67 lines
3.2 KiB
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), "小学");
|
|
}
|
|
} |