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

Java代码循环卡顿问题排查:计算n位数乘积的各位数字之和

解决n位数各位数字乘积之和的死循环问题

你的代码存在三个关键问题,直接导致死循环和结果错误:

  • 循环变量被非法篡改:在for循环内部的while里直接修改了循环变量i,彻底打乱了for的迭代逻辑。比如输入n=1时,第一次循环i从1变成0.1,之后i++变成1.1,再进入while变成0.11,永远达不到finish的10.0,直接陷入死循环。
  • 乘积变量未重置:MultipliedDigit在处理完每个数字后没有重置为1,会把所有数字的乘积持续累积,最终结果完全偏离预期。
  • 浮点类型的精度隐患:用double处理整数运算会出现精度丢失,比如大数的幂运算结果可能不是精确整数,导致循环范围计算出错。

修正后的代码如下:

import java.util.Scanner;

public class SummarynDigitNumbersDigitMultiplyDigit {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        int summary = 0;
        // 用整数运算确定n位数的范围,避免浮点精度问题
        int start = (int) Math.pow(10, n - 1);
        int finish = start * 10;

        for (int i = start; i < finish; i++) {
            int multipliedDigit = 1;
            int num = i; // 用临时变量处理各位数字,不修改循环变量i
            while (num > 0) {
                int digit = num % 10;
                multipliedDigit *= digit;
                num = num / 10;
            }
            summary += multipliedDigit;
        }
        System.out.println(summary);
    }
}

关键修改说明:

  1. 将所有涉及整数运算的变量替换为int类型,彻底避免浮点运算的意外问题。
  2. 新增临时变量num来拆解每个数字的各位,保留for循环变量i的原始值,确保循环能正常迭代到结束。
  3. 每次进入for循环时,都把multipliedDigit重置为1,保证每个数字的乘积计算独立。
  4. 用start * 10计算结束值,避免Math.pow可能带来的精度误差。

测试输入n=1时,循环遍历1-9,每个数字的乘积就是自身,总和为1+2+...+9=45,完全符合预期。

内容的提问来源于stack exchange,提问作者Solijon Iminov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:50:18