第一题
- 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?
根据题目,我们可以先写出前几个月兔子的数量找出规律,为了方便计算兔子总数,我们可以将当月兔子具有生育能力的对数,不具有生育能力的对数以及新生的兔子对数。
因为具有生育能力的兔子都会在当月生下一对兔子,因此新生兔子对数除了第一个月初始给的一对兔子,其余时候新生兔子对数就等于具有生育能力的兔子对数。
在写出前两个月兔子的情况之后,我们就可以依规律写出后面几个月兔子对数的情况:具有生育能力的兔子对数等于上一个月具有生育能力兔子的对数加前一个月新生兔子对数;不具有生育能力的兔子对数就等于上一个月不具有生育能力的兔子对数加上这个月新生的兔子对数再减去前一个月新生的兔子对数(因为前一个月的新生兔子在这个月成熟了)。由此我们可以画出下面的表格。
| 第一个月 | 第二个月 | 第三个月 | 第四个月 | 第五个月 | 第六个月 | 第七个月 | |
|---|---|---|---|---|---|---|---|
| 具有生育能力的兔子对数 | 0 | 0 | 1 | 1 | 2 | 3 | 5 |
| 不具有生育能力的兔子对数 | 1 | 1 | 1 | 2 | 3 | 5 | 8 |
| 新生兔子对数 | 1 | 0 | 1 | 1 | 2 | 3 | 5 |
| 兔子总数 | 1 | 1 | 2 | 3 | 5 | 8 | 13 |
根据这个表格兔子总对数的情况,我们可以找到一个规律,从第三个月起,每个月兔子的总对数就等于前两个月兔子总对数的和,这就是大名鼎鼎的斐波那契数列。根据这个规律我们就可以写出如下代码
public static int getRabbits(int month) {
// 月份不能小于0
if (month < 0) {
return -1;
}
// 第一个月和第二个月都只有一对兔子
if (month <= 2) {
return 1;
}
// 返回上一个月和上上个月兔子的对数和
return getRabbits(month - 1) + getRabbits(month - 2);
}
第二题
- 判断101-200之间有多少个素数,并输出所有素数。
这道题我们只需要遍历101~200,依次判断每个数是否为素数即可。
而判断素数的方法是,在遍历每一个数i的时候,引入一个标志flag来标志i是否为素数,flag初始为true,也就是默认i为素数,然后再遍历2~i-1,遍历过程中只要有一个数能整除i,则将flag置为false。代码如下:
public static void primeNumber() {
int count = 0; // 记录一共有几个素数
// 遍历100~200找出素数
for (int i = 100; i <= 200; i++) {
boolean flag = true; // 标志i是否位素数
// 遍历2~i-1,查找是否有i的因数,有则将flag置为false
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = false;
break;
}
}
// 根据flag判断是否为素数
if (flag) {
count++;
System.out.print(i + " ");
}
}
System.out.println();
System.out.println("100~200一共有" + count + "个素数。");
}
第三题
- 打印出所有的”水仙花数”,所谓”水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个”水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
对于这道题,我们只需要遍历100~999,然后判断是否为“水仙花数”即可。
判断方法:分别取得三位数的个位、十位、百位,然后计算个位、十位、百位三次方的和,再和原数比较,如果一样则表示是“水仙花数”,代码如下:
public static void lotus() {
// 遍历100~999,查找水仙花数
for (int i = 100; i < 1000; i++) {
if (isLotus(i))
System.out.print(i + " ");
}
System.out.println();
}
// 判断是否为水仙花数
private static boolean isLotus(int lotus) {
int m, n = lotus, sum;
m = n / 100; // 得到三位数的百位
n -= m * 100;
sum = m * m * m;
m = n / 10; // 得到十位数
n -= m * 10; // 得到个位数
sum += m * m * m + n * n * n;
return sum == lotus;
}
第四题
- 将一个正整数分解质因数。例如:输入90,打印出90=233*5。
对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
- 如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
- 如果n!=k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。
- 如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
代码如下:
public static void decompose(int n) {
System.out.print(n + " = ");
for (int i = 2; i < n + 1; i++) {
while (n % i == 0 && n != i) {
n /= i;
System.out.print(i + " * ");
}
if (n == i) {
System.out.println(i);
break;
}
}
}
第五题
- 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
条件运算符:条件? 结果1 : 结果2
当条件为真时,条件运算符的结果为结果1;条件为假时,条件运算符的结果为结果2
代码如下:
public static void grade(int n) {
if (n > 100 || n < 0)
System.out.println("输入无效");
else {
String str = (n >= 90) ? "分,属于A等" : ((n > 60) ? "分,属于B等" : "分,属于C等");
System.out.println(n + str);
}
}