问题
-
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问第二十个月的兔子对数为多少?
-
我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
问题分析
问题一思路:
- 为了存储多个月的兔子对数,定义一个数组,用动态初始化完成数组元素的初始化,长度为20
- 因为第1个月,第2个月兔子的对数是已知的,都是1,所以数组的第1个元素,第2个元素值也都是1 .
- 用循环实现计算每个月的兔子对数 4:输出数组中最后一个元素的值,就是第20个月的兔子对数。
问题二思路:
- 第1层循环,用于表示鸡翁的范围,初始化表达式的变量定义为 x=0,判断条件是x<=20
- 第2层循环,用于表示鸡母的范围,初始化表达式的变量定义为 y=0,判断条件是y<=(100 - 5 * x) / 3 (因为外层循环中鸡公已经花掉了一部分买鸡的钱,是已知的.)
- 这个时候,用于表示鸡雏的变量 z = 100 – x – y
- 判断表达式 z%3==0 和表达式 5x + 3y + z/3 = 100 是否同时成立,如果成立,输出 对应的 x,y,z 的值,就是对应的鸡翁,鸡母,鸡雏的值。
附上两组代码:
public class Test04 {
public static void main(String[] args) {
int[] arr = new int[20];
// 因为第1个月,第2个月兔子的对数是已知的,都是1,所以数组的第1、2个元素值也都是1。
arr[0] = 1;
arr[1] = 1;
// 后面几个月每一个元素是前两个元素的相加。
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 2] + arr[i - 1];
}
System.out.println("第二十个月兔子的对数为:" + arr[arr.length - 1]);
}
}
public class Test05 {
public static void main(String[] args) {
System.out.println("有以下几种方案:");
// 用两层循环控制鸡公、鸡母的范围,里面加条件。
for (int x = 0; x < 20; x++) {
for (int y = 0; y < (100 - 5 * x) / 3; y++) {
if ((100 - x - y) % 3 == 0 && 5 * x + 3 * y + (100 - x - y) / 3 == 100) {
System.out.println("鸡翁的个数为:" + x + " ,鸡母的个数为:" + y + ",鸡雏的个数为:" + (100 - x - y));
}
}
}
}
}
ps: 总结发现规律是解题的关键!!