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

JavaScript实现数字各位相乘功能异常求助:输入数字直接返回原数

问题排查与修复方案

嘿,我帮你梳理下代码里的问题,主要有两个关键点导致程序没按预期运行:

1. split() 方法没传分隔符,数组分割错误

你写的 numString.split() 没有传入任何参数,这会把整个数字字符串当成单个元素放进数组里。比如输入583转成字符串后是"583",split之后得到的是 ["583"],相乘的时候自然还是原数。正确的做法是用 split(''),这样会把每个字符单独分割出来,变成 ["5","8","3"]。

2. reducer 函数没被调用,且代码不完整

你定义了reducer函数,但没在persistence主函数里调用它,而且代码末尾的sum = sum * theNumArray[i]...明显没写完,这也会导致逻辑无法执行。

修复后的完整代码

这里给你两种版本,按需选择:

版本1:仅单次各位相乘(符合你给出的583→120的需求)

function persistence(num) {
  // 处理输入是个位数的情况,直接返回原数
  if (num < 10) return num;
  
  // 把数字转成单个数字的数组
  const numArray = num.toString().split('').map(t => parseInt(t));
  
  // 计算各位乘积
  let product = 1;
  for (let i = 0; i < numArray.length; i++) {
    product *= numArray[i];
  }
  
  return product;
}

// 测试一下
console.log(persistence(583)); // 输出120,完全符合预期

版本2:支持多次相乘直到得到个位数(数字持久化的完整逻辑)

如果需要像经典的数字持久化问题那样,比如输入39会得到3→(39=27→27=14→1*4=4,共3次操作),可以用递归实现:

function persistence(num) {
  // 个位数直接返回0(表示不需要相乘操作)
  if (num < 10) return 0;
  
  const numArray = num.toString().split('').map(t => parseInt(t));
  let product = 1;
  
  numArray.forEach(digit => product *= digit);
  
  // 递归调用,累计操作次数
  return 1 + persistence(product);
}

// 测试例子
console.log(persistence(39)); // 输出3
console.log(persistence(583)); // 输出2(5*8*3=120,1*2*0=0,共2次)

关键修复点再强调下

  • 一定要用 split('') 来分割字符串,才能得到单个数字的数组;
  • 确保计算乘积的逻辑被正确调用,不管是直接写在主函数里,还是调用单独的reducer函数,都要执行到那部分代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:19