作业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;
}
} -
方法重载分析
查看JDK源码发现System.out.println()有多个重载版本:
println(int x)
println(double x)
println(String x)
结论:重载只与方法名和参数列表有关,与返回值类型无关。 -
可变参数方法实现
public static double max(double... values) {
double largest = Double.MIN_VALUE;
for (double v : values) {
if (v > largest) largest = v;
}
return largest;
}
特点:可变参数必须是最后一个参数,方法内部按数组处理。 -
递归实现阶乘
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无此限制。 -
浮点数比较必须使用误差范围。
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;
}
}
}