题目分析:寻找区间内的完美整数
什么是完美整数? 完美整数的定义非常直观:一个整数由完全相同的数字构成。例如:
1、11、222 是完美整数。 19、101、123 则不是完美整数。 题目目标:在区间 [x, y] 中,统计所有完美整数的个数。
解题思路与分析
- 问题拆解 本题的核心是判断一个数字是否是由相同的数字构成。
如何判断数字的构成?
将数字逐位分解:获取个位、十位、百位等每一位的数字。 比较所有位是否相同。如果某一位与其他位不同,则该数字不是完美整数。 如何遍历区间?
从 x 遍历到 y,逐个判断每个数字是否是完美整数。 累计满足条件的数字个数。 2. 算法设计 数字分解
使用取模和整除操作: num % 10 获取当前数字的个位。 num /= 10 移除数字的个位,继续判断下一位。 如果在分解过程中发现某位数字与其他位不同,立即结束判断,跳过该数字。 区间遍历
遍历 [x, y] 的所有整数,对每个整数调用判断函数。 使用计数器记录符合条件的整数个数。 3. 时间复杂度分析 假设区间长度为 L = y - x + 1,数字长度为 d。 每次判断需要 O(d) 时间,总时间复杂度为 O(L * d)。 4. 边界情况 单位数字(如 1-9)都是完美整数,直接计数即可。 如果 x > y(非法区间),返回结果为 0。
bool isPerfectNumber(int num) {
int lastDigit = num % 10; // 获取个位数字
num /= 10; // 去掉个位数字
while (num > 0) {
int currentDigit = num % 10; // 当前的个位数字
if (currentDigit != lastDigit) {
return false; // 若有一位不同,则不是完美整数
}
num /= 10; // 去掉当前个位
}
return true; // 所有位都相同,则是完美整数
}
感悟与总结
这道题目表面简单,但数字分解和逻辑判断过程中仍有许多细节需要处理。通过逐位分析数字构造,我们更深刻理解了数字操作的基本技巧。
本题的最大收获在于:
数字分解和模式识别:掌握了如何逐位分析数字,并根据特定规则快速判断其特性。 边界条件的严谨性:确保代码处理了所有可能的特殊情况,如非法区间、单个数字的判断等。 写这段代码的过程让我意识到,数学逻辑在编程中的应用非常重要,而对问题的分解和优化,是提升代码效率和质量的关键所在。