lifei111

导航

 
  1. 手写随机数生成器
    public class LCGRandom {
    private static final long MODULUS = 2147483647L; // 2^31 - 1
    private static final long MULTIPLIER = 16807;
    private long state;

    public LCGRandom(long seed) {
    this.state = seed;
    }

    public int nextInt() {
    state = (MULTIPLIER * state) % MODULUS;
    return (int) state;
    }
    }

  2. 方法重载分析
    查看JDK源码发现System.out.println()有多个重载版本:
    println(int x)
    println(double x)
    println(String x)
    结论:重载只与方法名和参数列表有关,与返回值类型无关。

  3. 可变参数方法实现
    public static double max(double... values) {
    double largest = Double.MIN_VALUE;
    for (double v : values) {
    if (v > largest) largest = v;
    }
    return largest;
    }
    特点:可变参数必须是最后一个参数,方法内部按数组处理。

  4. 递归实现阶乘
    public static int factorial(int n) {
    if (n == 1 || n == 0) return 1;
    return n * factorial(n - 1);
    }
    递归要素:终止条件、递归调用、问题规模递减。
    public static BigInteger bigFactorial(int n) {
    if (n == 0) return BigInteger.ONE;
    return BigInteger.valueOf(n).multiply(bigFactorial(n - 1));
    }
    对比:int计算13!就会溢出,BigInteger无此限制。

  5. 浮点数比较必须使用误差范围。
    7.课堂测试
    import java.util.*;

public class MathTest {
private static Scanner scanner = new Scanner(System.in);
private static Random random = new Random();

public static void main(String[] args) {
showWelcome();
runMathTest();
}

public static void showWelcome() {
System.out.println("四则运算");
System.out.println();
}

public static void runMathTest() {
int timeLimit = setTimeLimit();
Set questions = generateQuestions(30);
startTest(questions, timeLimit);
}

public static int setTimeLimit() {
while (true) {
try {
System.out.print("设置测试时间(分钟): ");
int minutes = scanner.nextInt();
if (minutes > 0) {
return minutes * 60;
}
} catch (InputMismatchException e) {
System.out.println("请输入有效的数字");
scanner.next();
}
}
}

public static Set generateQuestions(int count) {
Set questions = new HashSet<>();
while (questions.size() < count) {
String question = generateSingleQuestion();
questions.add(question);
}
return questions;
}

public static String generateSingleQuestion() {
int operationType = random.nextInt(4);
int num1, num2, answer;
String operator;

switch (operationType) {
case 0:
num1 = random.nextInt(50) + 1;
num2 = random.nextInt(50) + 1;
operator = "+";
answer = num1 + num2;
break;
case 1:
num1 = random.nextInt(50) + 1;
num2 = random.nextInt(num1) + 1;
operator = "-";
answer = num1 - num2;
break;
case 2:
num1 = random.nextInt(9) + 1;
num2 = random.nextInt(9) + 1;
operator = "×";
answer = num1 * num2;
break;
default:
num2 = random.nextInt(8) + 2;
answer = random.nextInt(9) + 1;
num1 = num2 * answer;
operator = "÷";
break;
}

return num1 + operator + num2 + "=" + answer;
}

public static void startTest(Set questions, int timeLimit) {
System.out.println("\n测试即将开始...");
System.out.println("请按回车键开始答题");
scanner.nextLine();
scanner.nextLine();

Timer timer = new Timer();
final boolean[] timeUp = {false};
timer.schedule(new TimerTask() {
public void run() {
timeUp[0] = true;
System.out.println("\n时间到!");
}
}, timeLimit * 1000);

TestResult result = answerQuestions(new ArrayList<>(questions), timeUp);
timer.cancel();
showTestResult(result);
}

public static TestResult answerQuestions(List questions, final boolean[] timeUp) {
int correctCount = 0;
int totalAnswered = 0;
int questionNumber = 1;

System.out.println("\n开始答题\n");

for (String questionStr : questions) {
if (timeUp[0]) break;

String[] parts = questionStr.split("=");
String question = parts[0];
int correctAnswer = Integer.parseInt(parts[1]);

int userAnswer = getUserAnswer(questionNumber, question, timeUp);
if (timeUp[0]) break;

boolean isCorrect = checkAnswer(userAnswer, correctAnswer);
if (isCorrect) {
correctCount++;
}

totalAnswered++;
questionNumber++;
}

return new TestResult(totalAnswered, correctCount);
}

public static int getUserAnswer(int questionNumber, String question, final boolean[] timeUp) {
while (!timeUp[0]) {
try {
System.out.print("第" + questionNumber + "题: " + question + " = ");
return scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println("请输入数字");
scanner.next();
}
}
return -1;
}

public static boolean checkAnswer(int userAnswer, int correctAnswer) {
if (userAnswer == correctAnswer) {
System.out.println("正确");
return true;
} else {
System.out.println("错误,正确答案: " + correctAnswer);
return false;
}
}

public static void showTestResult(TestResult result) {
System.out.println("\n测试结果");
System.out.println("总题数: 30");
System.out.println("完成题数: " + result.totalAnswered);
System.out.println("正确题数: " + result.correctCount);
System.out.println("错误题数: " + (result.totalAnswered - result.correctCount));

if (result.totalAnswered > 0) {
double accuracy = (double) result.correctCount / result.totalAnswered * 100;
System.out.printf("正确率: %.1f%%\n", accuracy);
}
}

static class TestResult {
int totalAnswered;
int correctCount;

public TestResult(int totalAnswered, int correctCount) {
this.totalAnswered = totalAnswered;
this.correctCount = correctCount;
}
}
}

posted on 2025-10-08 12:49  猪头小呆呆  阅读(16)  评论(0)    收藏  举报