求JavaScript中最紧凑的多位数逐位求和至一位数的实现方案(非重复问题)
最紧凑的JavaScript数字逐位求和至一位数实现
嘿,这个需求其实不用写循环反复累加,利用**数根(Digital Root)**的数学性质,一行代码就能搞定最紧凑的实现!
核心公式原理
一个数的数根(也就是逐位求和到一位数的结果)有个现成的数学规律:
- 如果数字是0,数根就是0
- 否则,数根等于
n % 9,但如果余数是0(说明这个数是9的倍数),此时数根为9
一行紧凑实现
const digitalRoot = n => n ? (n % 9 || 9) : 0;
代码拆解解释
- 当
n不为0时:n % 9得到余数,若余数为0(比如n=9、18、5679这类9的倍数),0 || 9会返回9;若余数不为0,直接返回余数(也就是最终的一位数结果) - 当
n为0时,直接返回0,完全符合数根的定义
测试验证
- 输入
5678:5678 % 9 = 8,直接返回8,和手动计算的结果一致 - 输入
9:9 % 9 = 0,所以返回0 || 9即9 - 输入
0:返回0 - 输入
123:123 %9 = 6,返回6(对应1+2+3=6)
要是你非要用字符串遍历的方式(虽然效率和简洁度都不如数学方法),也能写成一行,但显然数学公式才是最紧凑高效的选择:
const digitalRootStr = n => n ? (n.toString().split('').reduce((a,b)=>+a+ +b,0) %9 ||9) :0;
内容的提问来源于stack exchange,提问作者VinceKaj
相关产品推荐
相关产品推荐

