From 44062e673aa0c5daaae1fb3c0def430665707f7b Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sun, 28 Sep 2025 00:59:22 +0800 Subject: [PATCH] Update SeniorProblem.java --- src/SeniorProblem.java | 122 ++++++++++------------------------------- 1 file changed, 29 insertions(+), 93 deletions(-) diff --git a/src/SeniorProblem.java b/src/SeniorProblem.java index 72cae10..fe22fe5 100644 --- a/src/SeniorProblem.java +++ b/src/SeniorProblem.java @@ -1,107 +1,43 @@ +import java.util.List; import java.util.Random; +/** + * 生成高中题目 + */ public class SeniorProblem implements ProblemsGenerator { private static final Random RANDOM = new Random(); - private static final String[] OPERATORS = {"+", "-", "*", "/"}; - private static final String[] POW_OPERATORS = {"√", "^2"}; - private static final String[] TRIG_OPERATORS = {"sin", "cos", "tan"}; + private final BracketManager bracketManager = new BracketManager(); + private final PowerManager powerManager = new PowerManager(); + private final TrigManager trigManager = new TrigManager(); + private final ExpressionBuilder expressionBuilder = new ExpressionBuilder(); @Override public String generate() { - String primaryExpression = generatePrimaryExpression(); - - return addHighSchoolOperators(primaryExpression); - } - - private String generatePrimaryExpression() { - int count = RANDOM.nextInt(4) + 2; - StringBuilder sb = new StringBuilder(); - - for (int i = 0; i < count; i++) { - int num = RANDOM.nextInt(100) + 1; - sb.append(num); - if (i < count - 1) { - sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" "); - } - } - return sb.toString(); - } - - private String addHighSchoolOperators(String primaryExpression) { - String[] parts = primaryExpression.split(" "); - StringBuilder result = new StringBuilder(); - boolean hasTrigonometry = false; - boolean hasAlgebra = false; - - for (int i = 0; i < parts.length; i++) { - String part = parts[i]; + String expression; + boolean hasTrig; + do { + int numCount = RANDOM.nextInt(5) + 1; + expression = expressionBuilder.generateBasicExpression(numCount); + List numPositions = expressionBuilder.getNumberPositions(expression); - if (isNumber(part)) { - if (!hasTrigonometry || RANDOM.nextDouble() < 0.6) { - part = applyTrigOperator(part); - hasTrigonometry = true; - } - else if (RANDOM.nextDouble() < 0.3) { - part = applyAlgebraOperator(part); - hasAlgebra = true; + if (RANDOM.nextDouble() < 0.8) { + int pairs = bracketManager.decideParenthesesPairs(numCount); + if (pairs > 0) { + expression = bracketManager.addParentheses(expression, pairs, numPositions); } } - result.append(part); - if (i < parts.length - 1) { - result.append(" "); - } - } - - if (!hasTrigonometry) { - return addTrigonometryForced(result.toString()); - } - - return result.toString(); - } - - private boolean isNumber(String str) { - try { - Integer.parseInt(str); - return true; - } catch (NumberFormatException e) { - return false; - } - } - - private String applyTrigOperator(String number) { - String operator = TRIG_OPERATORS[RANDOM.nextInt(TRIG_OPERATORS.length)]; - int num = Integer.parseInt(number); - int angle = generateValidAngle(operator); - return operator + angle + "°"; - } - - private String applyAlgebraOperator(String number) { - String operator = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)]; - int num = Integer.parseInt(number); - return operator.equals("√") ? "√" + num : num + "^2"; - } - - private int generateValidAngle(String trigOp) { - int angle = RANDOM.nextInt(100) + 1; - if (trigOp.equals("tan")) { - while (angle == 90) { - angle = RANDOM.nextInt(100) + 1; - } - } - return angle; - } - - private String addTrigonometryForced(String expression) { - String[] parts = expression.split(" "); - - for (int i = 0; i < parts.length; i++) { - if (isNumber(parts[i])) { - parts[i] = applyTrigOperator(parts[i]); - break; + // 添加三角函数并检查是否存在 + expression = trigManager.addTrigOperations(expression, numPositions); + List trigPositions = expressionBuilder.getNumberPositions(expression); + hasTrig = expression.contains("sin") || expression.contains("cos") || expression.contains("tan"); + + // 40% 概率加幂运算,避免与 trig 重叠 + if (RANDOM.nextDouble() < 0.4) { + expression = powerManager.addPowerOperationsAvoid(expression, numPositions, trigPositions); } - } + } while (expressionBuilder.hasDivideByZero(expression) || !hasTrig); - return String.join(" ", parts); + return expression; } -} \ No newline at end of file +}