作业1

  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<String> 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<String> generateQuestions(int count) {
    Set<String> 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<String> 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<String> 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 @ 2025-10-08 16:22  猪小猪ovo11  阅读(6)  评论(0)    收藏  举报