完美整数|豆包MarsCode AI刷题

46 阅读3分钟

问题描述

一个整数如果由相同的数字构成,则称为完美整数。例如:

  • 111333 是完美整数。
  • 1219101 是不完美整数。

现在,你需要计算给定区间 [x, y] 中有多少个整数是完美整数。

测试样例

样例1:

输入:x = 1 ,y = 10
输出:9

样例2:

输入:x = 2 ,y = 22
输出:10

解题思路

  1. 定义完美整数:一个整数如果由相同的数字构成,则称为完美整数。例如,111223333 都是完美整数。

2.判断一个数是否为完美整数:将整数转换为字符串和检查字符串中的所有字符是否相同。

3.遍历区间 [x, y]

  从 `x` 到 `y` 遍历每一个整数。
  对每一个整数判断其是否为完美整数。
  统计完美整数的数

关键步骤

  1. 遍历区间 [x, y]:使用 for 循环从 x 到 y 遍历每一个整数。
  2. 判断是否为完美整数:调用 isPerfectNumber 方法,该方法将整数转换为字符串并检查所有字符是否相同。
  3. 统计完美整数的数量:在 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. 减少字符比较的次数:在当前的实现中,我们每次都要比较字符串中的所有字符。我们可以通过减少比较次数来提高性能。