parent
4c0486861b
commit
04464953bf
@ -1,51 +1,36 @@
|
|||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成初中题目
|
||||||
|
*/
|
||||||
public class JuniorProblem implements ProblemsGenerator {
|
public class JuniorProblem implements ProblemsGenerator {
|
||||||
private static final Random RANDOM = new Random();
|
private static final Random RANDOM = new Random();
|
||||||
private static final String[] OPERATORS = {"+", "-", "*", "/"};
|
private final BracketManager bracketManager = new BracketManager();
|
||||||
private static final String[] POW_OPERATORS = {"√", "^2"};
|
private final PowerManager powerManager = new PowerManager();
|
||||||
|
private final ExpressionBuilder expressionBuilder = new ExpressionBuilder();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String generate() {
|
public String generate() {
|
||||||
String primaryExpr = generatePrimaryExpression();
|
String expression;
|
||||||
return addPowerOperators(primaryExpr);
|
boolean hasPower;
|
||||||
}
|
do {
|
||||||
|
int numCount = RANDOM.nextInt(5) + 1;
|
||||||
private String generatePrimaryExpression() {
|
expression = expressionBuilder.generateBasicExpression(numCount);
|
||||||
int count = RANDOM.nextInt(4) + 2;
|
List<Integer> numPositions = expressionBuilder.getNumberPositions(expression);
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
|
if (RANDOM.nextDouble() < 0.8) {
|
||||||
for (int i = 0; i < count; i++) {
|
int pairs = bracketManager.decideParenthesesPairs(numCount);
|
||||||
sb.append(RANDOM.nextInt(100) + 1);
|
if (pairs > 0) {
|
||||||
if (i < count - 1) {
|
expression = bracketManager.addParentheses(expression, pairs, numPositions);
|
||||||
sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private String addPowerOperators(String expr) {
|
|
||||||
String[] parts = expr.split(" ");
|
|
||||||
boolean hasPower = false;
|
|
||||||
|
|
||||||
for (int i = 0; i < parts.length; i++) {
|
|
||||||
if (parts[i].matches("\\d+") && (!hasPower || RANDOM.nextBoolean())) {
|
|
||||||
String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
|
|
||||||
parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2";
|
|
||||||
hasPower = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasPower) {
|
|
||||||
for (int i = 0; i < parts.length; i++) {
|
|
||||||
if (parts[i].matches("\\d+")) {
|
|
||||||
String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)];
|
|
||||||
parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2";
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
// 添加幂运算并检查添加是否成功
|
||||||
|
expression = powerManager.addPowerOperations(expression, numPositions);
|
||||||
|
hasPower = expression.contains("^2") || expression.contains("√");
|
||||||
|
} while (expressionBuilder.hasDivideByZero(expression) || !hasPower);
|
||||||
|
|
||||||
return String.join(" ", parts);
|
return expression;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in new issue