diff --git a/src/mathpuzzle/service/JuniorHighGenerator.java b/src/mathpuzzle/service/JuniorHighGenerator.java index 4e3bc59..7ebb330 100644 --- a/src/mathpuzzle/service/JuniorHighGenerator.java +++ b/src/mathpuzzle/service/JuniorHighGenerator.java @@ -1,13 +1,16 @@ package mathpuzzle.service; import java.util.*; +import static mathpuzzle.service.PrimarySchoolGenerator.isNumeric; + /** * 初中题目生成器 * 题目必须包含至少一个平方或开根号运算符 */ public class JuniorHighGenerator implements QuestionGenerator { private static final String[] ADVANCED_OPS = {"平方", "开根号"}; - private Random random = new Random(); + private static final String[] OPERATORS = {"+", "-", "*", "/"}; + private final Random random = new Random(); @Override public List generateQuestions(int count) { @@ -20,26 +23,85 @@ public class JuniorHighGenerator implements QuestionGenerator { } private String generateSingleQuestion() { - StringBuilder sb = new StringBuilder(); - int baseNum = random.nextInt(100) + 1; - sb.append(baseNum); + List parts = new ArrayList<>(); + int operandCount = random.nextInt(4) + 2; + parts = generateBase(operandCount, parts); + // 检测一下下面的循环是否加入了高级运算符,如果没有就启动保底 + boolean hasAdvancedOp = false; + if (operandCount > 2 && random.nextBoolean()) { + // 遍历查找左括号的合理位置 + for(int i = 0; i < parts.size() - 2; i++) { + // 该位置要为操作数且随机添加括号 + if (isNumeric(parts.get(i)) && random.nextBoolean()) { + // 随机数看取出来的是不是开根号运算符 + if("开根号".equals(ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)])) { + if(random.nextBoolean()) { + parts.set(i, "开根号(" + parts.get(i) + ")"); + } + else { + parts.set(i, "开根号(" + parts.get(i)); + // 为避免随机数上限出现0,此处要单独判断一下左括号正好括住倒数第二个操作数的情况 + if (i == parts.size() - 3) { + parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")"); + } else { + while(true) { + int i2 = random.nextInt(parts.size() - 3 - i) + 2; + if(isNumeric(parts.get(i + i2))) { + parts.set(i + i2, parts.get(i + i2) + ")"); + break; + } + } + } + } + } + // 如果不是开根号就是平方运算 + else { + parts.set(i, "(" + parts.get(i)); + // 为避免随机数上限出现0,此处要单独判断一下左括号正好括住倒数第二个操作数的情况 + if (i == parts.size() - 3) { + parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")"); + } else { + while(true) { + int i2 = random.nextInt(parts.size() - 3 - i) + 2; + if(isNumeric(parts.get(i + i2))) { + parts.set(i + i2, parts.get(i + i2) + ")平方"); + break; + } + } + } + } + hasAdvancedOp = true; + break; + } + } + } // 强制加入一个高级运算符 + if(!hasAdvancedOp) { + parts = forceAddAdvancedOp(parts); + } + return String.join(" ", parts) + " ="; + } + // 产生基本操作 + public List generateBase(int operandCount, List parts) { + for (int i = 0; i < operandCount; i++) { + int num = random.nextInt(100) + 1; + parts.add(String.valueOf(num)); + if (i < operandCount - 1) { + parts.add(OPERATORS[random.nextInt(OPERATORS.length)]); + } + } + return parts; + } + // 强制加入一个高级运算符 + public List forceAddAdvancedOp(List parts) { String advancedOp = ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)]; if ("平方".equals(advancedOp)) { - sb.append(" ").append(advancedOp); + parts.add("平方"); } else { // 开根号 - sb.insert(0, advancedOp + "(").append(")"); - } - - // 可能再附加一个基础运算 - if (random.nextBoolean()) { - String[] basicOps = {"+", "-", "*", "/"}; - String op = basicOps[random.nextInt(basicOps.length)]; - int anotherNum = random.nextInt(100) + 1; - sb.append(" ").append(op).append(" ").append(anotherNum); + parts.set(0, "开根号(" + parts.get(0)); + parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")" ); } - - return sb.toString() + " ="; + return parts; } } diff --git a/src/mathpuzzle/service/PrimarySchoolGenerator.java b/src/mathpuzzle/service/PrimarySchoolGenerator.java index 92fd757..21b311a 100644 --- a/src/mathpuzzle/service/PrimarySchoolGenerator.java +++ b/src/mathpuzzle/service/PrimarySchoolGenerator.java @@ -7,7 +7,7 @@ import java.util.*; */ public class PrimarySchoolGenerator implements QuestionGenerator { private static final String[] OPERATORS = {"+", "-", "*", "/"}; - private Random random = new Random(); + private final Random random = new Random(); @Override public List generateQuestions(int count) { @@ -21,15 +21,8 @@ public class PrimarySchoolGenerator implements QuestionGenerator { private String generateSingleQuestion() { int operandCount = random.nextInt(4) + 2; // 2-5个操作数 List parts = new ArrayList<>(); - - for (int i = 0; i < operandCount; i++) { - int num = random.nextInt(100) + 1; - parts.add(String.valueOf(num)); - if (i < operandCount - 1) { - parts.add(OPERATORS[random.nextInt(OPERATORS.length)]); - } - } - + // 生成基础操作 + parts = generateBase(operandCount, parts); // 简单添加括号逻辑:随机加一个括号 if (operandCount > 2 && random.nextBoolean()) { // 遍历查找左括号的合理位置 @@ -67,4 +60,15 @@ public class PrimarySchoolGenerator implements QuestionGenerator { return false; } } + + public List generateBase(int operandCount, List parts) { + for (int i = 0; i < operandCount; i++) { + int num = random.nextInt(100) + 1; + parts.add(String.valueOf(num)); + if (i < operandCount - 1) { + parts.add(OPERATORS[random.nextInt(OPERATORS.length)]); + } + } + return parts; + } } \ No newline at end of file