猜年龄
目录
题目描述
小明带两个妹妹参加元宵灯会。别人问她们多大了,她们调皮地说:“我们俩的年龄之积是年龄之和的 6 倍”。小明又补充说:“她们可不是双胞胎,年龄差肯定也不超过 8 岁啊。”
请你写出:小明的较小的妹妹的年龄。
思路分析
问题核心
我们需要找到两个年龄 ( i ) 和 ( j ),满足以下条件:
- 年龄之积是年龄之和的 6 倍,即 ( i \times j = 6 \times (i + j) )。
- 年龄差不超过 8 岁,即 ( |i - j| \leq 8 )。
- 两个年龄不相等(因为她们不是双胞胎)。
思路拆解
- 遍历可能的年龄:
- 使用双重循环遍历所有可能的年龄组合 ( (i, j) ),其中 ( i ) 和 ( j ) 都小于 100。
- 检查条件:
- 对于每一对 ( (i, j) ),检查是否满足 ( i \times j = 6 \times (i + j) ) 和 ( |i - j| \leq 8 )。
- 输出结果:
- 找到满足条件的年龄组合后,输出较小的年龄。
代码段
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
for (int i = 1; i < 100; i++) {
for (int j = 1; j < i; j++) {
if (i * j == 6 * (i + j) && Math.abs(i - j) <= 8) {
System.out.println(Math.min(i, j));
}
}
}
scan.close();
}
}
代码逐行讲解
-
输入处理:
Scanner scan = new Scanner(System.in);
- 使用
Scanner
读取输入(虽然本题不需要输入,但题目模板中包含了Scanner
)。
- 使用
-
遍历年龄组合:
for (int i = 1; i < 100; i++) { for (int j = 1; j < i; j++) {
- 使用双重循环遍历所有可能的年龄组合 ( (i, j) ),其中 ( i ) 和 ( j ) 都小于 100,且 ( j < i )。
-
检查条件:
if (i * j == 6 * (i + j) && Math.abs(i - j) <= 8) {
- 检查当前年龄组合是否满足 ( i \times j = 6 \times (i + j) ) 和 ( |i - j| \leq 8 )。
-
输出结果:
System.out.println(Math.min(i, j));
- 如果满足条件,输出较小的年龄。
-
关闭输入流:
scan.close();
- 关闭
Scanner
以释放资源。
- 关闭
复杂度分析
时间复杂度
- 双重循环遍历所有可能的年龄组合,时间复杂度为 O(100 * 100) = O(10,000)。
空间复杂度
- 只使用了常数级别的额外空间,因此空间复杂度为 O(1)。
总结的知识点
-
输入处理:
- 使用
Scanner
读取输入(虽然本题不需要输入)。
- 使用
-
循环与条件判断:
- 使用双重循环遍历所有可能的年龄组合。
- 使用
if
语句检查是否满足条件。
-
数学计算:
- 使用
Math.abs
计算年龄差的绝对值。 - 使用
Math.min
找到较小的年龄。
- 使用
整合
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
for (int i = 1; i < 100; i++) {
for (int j = 1; j < i; j++) {
if (i * j == 6 * (i + j) && Math.abs(i - j) <= 8) {
System.out.println(Math.min(i, j));
}
}
}
scan.close();
}
}
总结
掌握了如何使用双重循环遍历所有可能的组合,并通过条件判断找到满足特定条件的解。关键点包括:
- 使用双重循环遍历年龄组合。
- 使用
if
语句检查是否满足条件。 - 使用
Math.abs
和Math.min
进行数学计算。