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.
projectone/ElementaryProblemGenerator....

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), "小学");
}
}