问题描述
一个整数如果由相同的数字构成,则称为完美整数。例如:
1、11、333是完美整数。12、19、101是不完美整数。
现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。
测试样例
样例1:
输入:
x = 1 ,y = 10
输出:9
样例2:
输入:
x = 2 ,y = 22
输出:10
解题思路
- 定义完美整数:一个整数如果由相同的数字构成,则称为完美整数。例如,
111、22、3333都是完美整数。
2.判断一个数是否为完美整数:将整数转换为字符串和检查字符串中的所有字符是否相同。
3.遍历区间 [x, y]
从 `x` 到 `y` 遍历每一个整数。
对每一个整数判断其是否为完美整数。
统计完美整数的数
关键步骤
- 遍历区间
[x, y]:使用for循环从x到y遍历每一个整数。 - 判断是否为完美整数:调用
isPerfectNumber方法,该方法将整数转换为字符串并检查所有字符是否相同。 - 统计完美整数的数量:在
solution方法中使用count变量统计完美整数的数量。
代码如下:public class Main {
public static int solution(int x, int y) {
int count = 0;
// 遍历区间 [x, y]
for (int i = x; i <= y; i++) {
// 判断当前数是否为完美整数
if (isPerfectNumber(i)) {
count++;
}
}
return count;
}
// 判断一个数是否为完美整数
private static boolean isPerfectNumber(int num) {
// 将整数转换为字符串
String numStr = String.valueOf(num);
// 获取字符串的第一个字符
char firstChar = numStr.charAt(0);
// 检查字符串中的所有字符是否相同
for (int i = 1; i < numStr.length(); i++) {
if (numStr.charAt(i) != firstChar) {
return false;
}
}
return true;
}
public static void main(String[] args) {
// 添加你的测试用例
System.out.println(solution(1, 10) == 9);
System.out.println(solution(2, 22) == 10);
}
}
代码分析: 1.主函数 solution:我们通过嵌套循环依次生成每个基础数字d(1到9)的完美整数。对于每个d,我们通过num=num*10+d不断生成长度增加的完美整数。 2.范围检查:只要生成的完美整数在区间【x,y】之内,就将其计入结果。 3.停止条件:当生成的完美整数超过区间的上界y时,停止生成。
完美数的定义:是一种特殊的自然数,它所有的真因子(除了自身之外的约数)之和恰好等于它本身。 性质:1.三角形性质:所有的完全数都是三角形倒数,即可以表示为连续自然数的和。 2.倒数和性质:完美数的所有因数的倒数和为2。 3.尾数规律:迄今为止发现的所有完美数的尾数都是6或8。
建议:当面对一个问题时,考虑问题涉及到的知识点定义以及性质,了解性质的使用技巧,不断的练习,反复练习,不断优化代码,1.减少字符串转换的开销:每次将整数转换为字符串都会有一定的开销。我们可以通过直接操作整数的每一位来避免这种开销。2. 减少字符比较的次数:在当前的实现中,我们每次都要比较字符串中的所有字符。我们可以通过减少比较次数来提高性能。