第二讲方法_课后作业 (1)

Java第二讲「方法」课后作业

一、动手动脑:纯随机数发生器

题目:用公式 x(n+1) = (a*x(n) + c) mod m 写一个方法,生成指定个数的随机整数。其中 m=2^31-1,a=16807,c=0。

代码:

public class MyRandom {
private long seed;
private static final long M = 2147483647L;
private static final long A = 16807L;
private static final long C = 0;

public MyRandom(long seed) {
this.seed = seed;
}

public long next() {
seed = (A * seed + C) % M;
return seed;
}

public static void main(String[] args) {
MyRandom r = new MyRandom(System.currentTimeMillis());
for (int i = 0; i < 10; i++) {
System.out.println(r.next());
}
}
}

二、动手动脑:方法重载 MethodOverLoad

题目:看下面代码有什么特殊之处?

public class MethodOverload {
public static void main(String[] args) {
System.out.println(square(7));
System.out.println(square(7.5));
}
public static int square(int x) {
return x * x;
}
public static double square(double y) {
return y * y;
}
}

回答:两个方法都叫 square,但一个参数是 int,一个是 double。方法名相同、参数列表不同

四、动手动脑:递归求 n!

public class CalculateN {
public static long f(int n) {
if (n == 1) {
return 1;
}
return n * f(n - 1);
}

public static void main(String[] args) {
System.out.println(f(5)); // 输出120
}
}

五、课后实验:四则运算自动出题(阶段1)

题目:写一个程序自动生成30道小学四则运算题。

import java.util.Random;

public class MathTest1 {
public static void main(String[] args) {
Random ran = new Random();
String[] op = {"+", "-", "*", "/"};
for (int i = 1; i <= 30; i++) {
int a = ran.nextInt(100) + 1;
int b = ran.nextInt(100) + 1;
String o = op[ran.nextInt(4)];
System.out.println(i + ". " + a + " " + o + " " + b + " =");
}
}
}

六、课后实验:四则运算答题系统(阶段2)

import java.util.*;

public class MathTest2 {
static Random ran = new Random();
static List<String> used = new ArrayList<>();
static int right = 0, wrong = 0;
static final int TOTAL = 30;
static final int TIME = 120;

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long start = System.currentTimeMillis();

System.out.println("共" + TOTAL + "题,限时" + TIME + "秒");
for (int i = 1; i <= TOTAL; i++) {
long t = (System.currentTimeMillis() - start) / 1000;
if (t >= TIME) {
System.out.println("时间到!");
break;
}
int[] q = genQuestion();
System.out.print("第" + i + "题(剩" + (TIME - t) + "秒): "
+ q[0] + " " + opName(q[3]) + " " + q[1] + " = ");
int ans = sc.nextInt();
if (ans == q[2]) {
right++;
} else {
wrong++;
System.out.println("错了,正确答案是" + q[2]);
}
}
grade();
sc.close();
}

static int[] genQuestion() {
int a, b, ans, op;
while (true) {
op = ran.nextInt(4);
if (op == 0) { // 加法
a = ran.nextInt(100) + 1;
b = ran.nextInt(100) + 1;
ans = a + b;
} else if (op == 1) { // 减法,保证a>=b
a = ran.nextInt(100) + 1;
b = ran.nextInt(100) + 1;
if (a < b) { int tmp = a; a = b; b = tmp; }
ans = a - b;
} else if (op == 2) { // 乘法,结果不到四位数
a = ran.nextInt(20) + 1;
b = ran.nextInt(20) + 1;
ans = a * b;
} else { // 除法,保证整除
b = ran.nextInt(9) + 1;
int q = ran.nextInt(10) + 1;
a = b * q;
ans = q;
}
String s = a + "" + op + b;
if (!used.contains(s)) {
used.add(s);
return new int[]{a, b, ans, op};
}
}
}

static String opName(int op) {
String[] s = {"+", "-", "*", "/"};
return s[op];
}

static void grade() {
int done = right + wrong;
System.out.println("答对:" + right + " 答错:" + wrong);
if (done > 0) {
double rate = right * 100.0 / done;
System.out.printf("正确率:%.1f%%\n", rate);
}
if (done < TOTAL) {
System.out.println("有" + (TOTAL - done) + "题没做完");
}
}
}

posted @ 2026-10-08 13:51  梁煜昊  阅读(3)  评论(0)    收藏  举报