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
相关产品推荐
相关产品推荐

