小学一年级数学计算题训练
package com.zaw.util;
import java.util.*;
public class Math50ProblemsGenerator {
public static void main(String[] args) {
List<String> problems = generateUniqueProblems(1000);
Collections.shuffle(problems); // 打乱题目顺序
// 找到最长的题目长度,用于格式化输出
int maxLength = 0;
for (String problem : problems) {
maxLength = Math.max(maxLength, problem.length());
}
// 格式化字符串,"%-" + maxLength + "s" 表示左对齐,并至少占用 maxLength 个字符的宽度
String format = "%-" + maxLength + "s";
// 每行打印4题
for (int i = 0; i < problems.size(); i += 6) {
for (int j = 0; j < 6 && i + j < problems.size(); j++) {
System.out.printf(format, problems.get(i + j)); // 使用String.format进行格式化输出
System.out.print("\t"); // \t 表示制表符,用于在格式化后的题目之间添加一些空格
}
System.out.println(); // 换行
}
}
private static List<String> generateUniqueProblems(int numProblems) {
List<String> problems = new ArrayList<>();
Random random = new Random();
// 确保题目唯一且不重复,我们需要使用一个集合来记录已生成的题目
// 这里只记录加数和减数对,不记录答案,因为答案可以计算得出
Set<String> uniquePairs = new HashSet<>();
while (problems.size() < numProblems) {
int num1 = random.nextInt(100) + 1;
int num2 = random.nextInt(100) + 1;
boolean isAddition = random.nextBoolean();
// 构造唯一标识字符串,用于检查是否重复
String pairKey = num1 + "-" + num2 + "-" + isAddition;
// 如果这对数字还没有被使用过,则生成题目
if (uniquePairs.add(pairKey)) {
String problem;
if (isAddition) {
problem = num1 + " + " + num2 + " = ";
} else {
// 确保减法不会得到负数
if (num1 >= num2) {
problem = num1 + " - " + num2 + " = ";
} else {
// 如果减法会得到负数,则重新生成数字
continue;
}
}
problems.add(problem);
}
}
return problems;
}
}