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

