0-1000 的数字里,恰好只有一个5的数的个数
0-1000 的数字里,恰好只有一个5的数的个数
2024.11.10架构考试选择题。写在前面,我觉得今年的选择题出的特别好,更多考察考生的逻辑思维能力和数学能力,专业的说就是考算法。以往都是以程序实现思维的互联网工作者,首次以心算手算的方式计算,的确是一个好的开始,重视人的思维了。
题目
0-1000 的数字里,恰好只有一个5的数的个数 A、242 B、243 C、225 D、224 如果这种题目是选择题,有什么快捷的思路获得结果吗
0-1000 的数字里,恰好只有一个5的数的个数A、242B、243C、225D、224
程序员思维 使用代码实现:
我们先使用编辑器插件提示生成代码示例如下:
/*** @author zhizhou 2024/11/11 09:09*/
public class countNumberWithOneFive {//写一段代码 求1-1000之间的数字中 只含有一个5的数字有哪些 有多少个 public static void main(String[] args) {int count = 0;for (int i = 1; i <= 1000; i++) {String str = String.valueOf(i);if (str.contains("5") && str.indexOf("5") == str.lastIndexOf("5")) {count++;System.out.println(i);}}System.out.println("共有" + count + "个数字");}
}
代码实现问问gpt:
chatgpt给出的思路也是字符串比较,最终和上述代码结果一致。
可以用以下 Java 代码来找到 1 到 1000 之间只含有一个数字 5 的数字,并统计其数量:
使用循环遍历 1 到 1000 之间的所有数字,将每个数字转换成字符串形式,使用 chars().filter()
来统计字符 ‘5’ 的个数。
public class SingleFiveCounter {public static void main(String[] args) {int count = 0;System.out.println("Numbers with only one '5' between 1 and 1000:");for (int i = 1; i <= 1000; i++) {String number = Integer.toString(i);if (number.chars().filter(ch -> ch == '5').count() == 1) {System.out.println(i);count++;}}System.out.println("Total count: " + count);}
}
但是呢,考试是选择题,没有机会去写代码的,所以搞清楚出题思路才是关键。
实际考试当中是不会有机会写代码实现的,那如何实现心算和手算呢?思路如下,对于这种题目,分析数字出现的规律,可以简化计算。
解题思路
-
分情况统计:考察1-1000的数位,把包含一个“5”的情况按每个位数来分析。
- 从 0 到 999 中,百位、十位和个位各有一位可能出现“5”。
-
单个位上出现“5”:
- 百位、十位和个位上恰好出现一个“5”的数字数量,且其他位不含“5”:
- 百位上是“5”,十位和个位可以是 0-9(但不能是 5),共有 (9 \times 9 = 81) 个。
- 十位上是“5”,百位和个位可以是 0-9(但不能是 5),共有 (9 \times 9 = 81) 个。
- 个位上是“5”,百位和十位可以是 0-9(但不能是 5),共有 (9 \times 9 = 81) 个。
- 百位、十位和个位上恰好出现一个“5”的数字数量,且其他位不含“5”:
-
总和:将上述情况相加得到:
[
81 + 81 + 81 = 243
]
所以,答案是 B、243。
总结
这种题目的快捷思路就是:
- 先明确每个位数单独为“5”时的情况。
- 按位组合,计算不同位置上包含一个“5”的组合数,再汇总。