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

反转整数并转文本的JavaScript程序陷入死循环,求问题原因

代码无限循环问题分析

输入123时,程序预期先反转整数得到321,再输出对应文本"one two three",但第一段代码会无限输出"one one one...",问题根源拆解如下:

第一段有问题的代码

let list = [
  "zero",
  "one",
  "two",
  "three",
  "four",
  "five",
  "six",
  "seven",
  "eight",
  "nine",
];

n = 123;
let rev = 0;

while (n > 0) {
  last_digit = Math.floor(n % 10);
  n = Math.floor(n / 10);
  rev = rev * 10 + last_digit;
}

while (rev > 0) {
  rem = Math.floor(rev % 10);
  n = Math.floor(rev / 10);
  console.log(list[rem]);
}

问题核心

  1. 第一个while循环结束后,原输入变量n被逐步除以10,最终变成0,而rev成功得到反转后的整数321。
  2. 进入第二个while循环后,循环条件是rev > 0,但循环内部从未修改过rev的值——你只是把rev/10的结果赋值给了n,rev始终保持321不变。
  3. 这导致每次循环都会计算321%10得到1,输出list[1]即"one",同时rev永远大于0,循环永远无法终止,进而无限输出"one"。

修复后的代码(第二段)

let list = [
  "zero",
  "one",
  "two",
  "three",
  "four",
  "five",
  "six",
  "seven",
  "eight",
  "nine",
];

n = 123;
let rev = 0;

while (n > 0) {
  last_digit = Math.floor(n % 10);
  n = Math.floor(n / 10);
  rev = rev * 10 + last_digit;
}

let r = rev;
while (r > 0) {
  rem = Math.floor(r % 10);
  r = Math.floor(r / 10);
  console.log(list[rem]);
}

修复原理

第二段代码新增变量r,将反转后的rev赋值给r,然后在第二个循环中修改的是r的值:每次循环把r除以10,r会从321变为32,再变为3,最后变为0,当循环条件r>0不成立时终止,就能正常输出"one two three"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:37:33