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

JavaScript中使用while loop实现数字各位反复累加至单个数字的问题

解决数字根计算的问题

嘿,别担心,这绝对是新手常遇到的问题,我来帮你捋清楚!

你的代码思路是对的,但问题出在第一次循环后的数据类型变化上:
当你执行splite = splite.reduce(getSum)时,reduce返回的是一个数字(比如例子里的113),而不是数组。这时候splite变成了数字,数字没有length属性,所以while (splite.length > 1)的条件会被判定为false,循环直接停止,自然没法继续相加到单个数字。

修正你的原始代码

我们只需要在每次计算完总和后,把结果再转回数组,让循环能继续执行:

function rootFunc(n) {
  let splite = n.toString().split('').map(x => Number(x)); 
  while (splite.length > 1) {
    // 先计算当前数组的总和
    const sum = splite.reduce(getSum);
    // 把总和重新转换成数字数组,供下一次循环使用
    splite = sum.toString().split('').map(x => Number(x));
  }
  // 最后数组只剩一个元素,返回它
  return splite[0];
}

function getSum(total, num) {
  return total + num;
}

console.log(rootFunc(3253611569939992595156)); // 输出5

更高效的数字处理版本

如果不想反复转换字符串和数组,也可以直接操作数字本身,效率会更高:

function rootFunc(n) {
  let num = n;
  // 只要数字大于等于10,就继续拆分相加
  while (num >= 10) {
    let sum = 0;
    // 拆分当前数字的每一位相加
    while (num > 0) {
      sum += num % 10; // 取最后一位数字
      num = Math.floor(num / 10); // 去掉最后一位
    }
    num = sum; // 更新为新的总和,进入下一轮循环
  }
  return num;
}

console.log(rootFunc(3253611569939992595156)); // 输出5

数学公式秒杀法(数字根公式)

其实你要计算的这个值叫做数字根,有现成的数学公式可以直接计算,不需要循环,效率最高:

  • 如果输入是0,返回0
  • 如果输入是9的倍数,返回9
  • 否则返回输入对9取余的结果

代码实现:

function rootFunc(n) {
  if (n === 0) return 0;
  return n % 9 === 0 ? 9 : n % 9;
}

console.log(rootFunc(3253611569939992595156)); // 输出5

这个公式的原理是:一个数的数字根等于它对9的余数(除了当数本身是9的倍数且不为0时,数字根是9)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:02:20