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); } }
关键修改说明:
- 将所有涉及整数运算的变量替换为
int类型,彻底避免浮点运算的意外问题。 - 新增临时变量
num来拆解每个数字的各位,保留for循环变量i的原始值,确保循环能正常迭代到结束。 - 每次进入
for循环时,都把multipliedDigit重置为1,保证每个数字的乘积计算独立。 - 用
start * 10计算结束值,避免Math.pow可能带来的精度误差。
测试输入n=1时,循环遍历1-9,每个数字的乘积就是自身,总和为1+2+...+9=45,完全符合预期。
内容的提问来源于stack exchange,提问作者Solijon Iminov
相关产品推荐
相关产品推荐

