You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计指定范围快乐数数量的Java代码错误排查求助

问题原因
  1. 平方和计算逻辑有精度隐患:你在计算各位平方时使用了Math.pow()方法,该方法返回double类型的浮点值,浮点运算存在精度误差,比如计算3²时可能返回8.999999999999998,赋值给int类型的sum时会被截断为8,直接导致平方和计算错误,后续判断全部失效。
  2. 区间统计逻辑不完整:getHappyNumbers方法中的循环条件为i < max,默认排除了区间右端点max,如果题目要求统计闭区间[min, max]内的快乐数,会漏掉max的统计结果。
  3. 判断分支存在冗余代码:你写的else return true是永远不会被执行的死代码,前面的else if (sum !=1)已经覆盖了所有剩余场景,属于不规范的冗余写法。
修改方案
  1. 替换平方计算逻辑,用整数乘法替代Math.pow(),避免浮点精度问题,同时简化冗余的判断分支。
  2. 调整循环条件为i <= max,覆盖闭区间右端点。

修改后的完整可运行代码如下:

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String st1 = scan.nextLine().trim();
        String st2 = scan.nextLine().trim();

        int min = Integer.parseInt(st1);
        int max = Integer.parseInt(st2);

        Set<Integer> happyNumbers = getHappyNumbers(min, max);
        System.out.println(happyNumbers.size());

    }

    public static Set<Integer> getHappyNumbers(int min, int max) {
        Set<Integer> out = new HashSet<>();
        // 调整循环条件,包含右端点max
        for (int i = min; i <= max; i++) {
            if (isHappy(i)) {
                out.add(i);
            }
        }
        return out;
    }

    private static boolean isHappy(int num) {
        int sum = 0;
        while (num != 0) {
            int digit = num % 10;
            // 整数乘法计算平方,避免浮点精度问题
            sum += digit * digit;
            num /= 10;
        }
        if (sum == 4) return false;
        if (sum == 1) return true;
        // 简化冗余分支,直接递归
        return isHappy(sum);
    }
}

内容的提问来源于stack exchange,提问作者Sjoerd van Bussem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:15:03