Javascript 对一个数字的所有数字求和

Javascript 对一个数字的所有数字求和,javascript,numbers,sum,digits,Javascript,Numbers,Sum,Digits,我是新手 我想做一个小应用程序,它将计算一个数字的所有数字之和 例如,如果我有数字2568,应用程序将计算2+5+6+8,这等于21。最后,它将计算21位数字的和,最终结果为3 请帮助我基本上,你有两种方法来计算整数所有部分的和 使用数字运算 取这个数字,把剩下的十加起来。然后取数字除以10的整数部分。继续 var值=2568, 总和=0; while(值){ 总和+=值%10; 值=数学下限(值/10); } 控制台日志(总和)这个使用模9算法的简单方法怎么样 function sum

我是新手

我想做一个小应用程序,它将计算一个数字的所有数字之和

例如,如果我有数字2568,应用程序将计算2+5+6+8,这等于21。最后,它将计算21位数字的和,最终结果为3


请帮助我

基本上,你有两种方法来计算整数所有部分的和

  • 使用数字运算

    取这个数字,把剩下的十加起来。然后取数字除以10的整数部分。继续

var值=2568,
总和=0;
while(值){
总和+=值%10;
值=数学下限(值/10);
}

控制台日志(总和)这个使用模9算法的简单方法怎么样

function sumDigits(n) {
  return (n - 1) % 9 + 1;
}

可以使用该函数(基于其他答案)计算数字总和:

如果确实需要递归求和,则函数有递归版本:

function sumDigitsRecursively(n) {
    let sum = sumDigits(n);
    if (sum < 10)
        return sum;
    else
        return sumDigitsRecursively(sum);
}
函数递归地求和(n){
设sum=sumdights(n);
如果(总和<10)
回报金额;
其他的
递归返回sumdigits(sum);
}
sumdigits递归(2568)
表达式将等于
3
。因为
2+5+6+8=21
2+1=3

请注意,@FedericoAntonucci应该更有效,但如果需要,它不会提供中间数字和。

让我们试试递归

function sumDigits(n) {
  if (n < 10) return n
  return sumDigits(n % 10 + sumDigits(Math.floor(n / 10)))
}

sumDigits(2) // 2
sumDigits(2568) // 3
<代码>功能数字(n){ 如果(n<10)返回n 返回总和数字(n%10+总和数字(数学层(n/10))) } 三位数(2)//2 三位数(2568)//3
使用mathy公式:

没有mathy公式:

<代码>功能数字(n){ 如果(类型n!=='string'){ n=n.toString(); } 如果(n.长度<2){ 返回parseInt(n); } ​ 返回数字( n、 拆分(“”) .reduce((acc,num)=>acc+=parseInt(num),0) ); }
如果将数字视为字符串(“2568”),然后在每个字符上拆分该字符串(str.split(“”)),则将在数组中分别列出每个数字。每个数字仍然是一个字符串,但您可以将每个数字转换为一个数字并相加。我如何告诉脚本从特定输入中获取数字而不是给定的数字?我的工作迄今为止可能重复的非常感谢much@Nina,为什么正好是模10?你介意扩展一下吗?@Daniel,余数运算符用于获取数字以相加。实际上
11%9=2
,而不是1,因此
1+2=3
注意:它递归地查找数字的和(从问题的标题和公认的答案中不清楚)@AlexShevyakov忽略-1和+1,那么它只是n%9。因为一个数n=10^k*a_k+10^(k-1)*a_(k-1)…10^0*a_0。模9删除所有10^i,因为10^i模9=1。然后,求和也被创建为模9。当你想象-1将整行数字向左移动1时,你也能正确地得到9。在这之后,你只需再加一次。@FedericoAntonucci显然,对于所有大于10且余数1除以9的数字,它都会失败。例如19,28,37,46。。。等等对于这些情况,函数应该返回10,而不是返回1。@R3l1c函数应该递归地返回和,这正是问题所要求的,请重新阅读。这个解决方案非常适合这个问题。这个问题是关于digits@FedericoAntonucci但是你没有递归地将函数命名为
sumDigits
,它确实证实了我的观点,因为我正在寻找只对sumDigits进行运算的方法。我的答案包含的解决方案给出的结果与你的相同。为什么你否决了我的答案?因为递归解决方案并不比其他任何答案都好,而且它是我在这里得到的不太优雅的解决方案,当时我只寻找数字的数字和,而接受的答案不包含一个只接收数字并返回和的函数。所以我成功了。接受的解决方案调用了
Math.float
,但不需要这样做。因此,对于我的任务来说,这是一个更好的解决方案。此外,递归版本的效率只比您的稍低一点(我在回答中提到了这一点),但它很容易理解。另一方面,你没有解释你的解决方案是如何工作的,也没有正确地命名它,因此它给我和@Raknos13造成了混乱。我只是回答这个问题,它没有问你在说什么,你应该阅读整个问题,而不仅仅是标题
function sumDigits(n) {
  if (n < 10) return n
  return sumDigits(n % 10 + sumDigits(Math.floor(n / 10)))
}

sumDigits(2) // 2
sumDigits(2568) // 3
function sumDigits(n) { 
    return (--n % 9) + 1;
}
function sumDigits(n) {
    if (typeof n !== 'string') {
        n = n.toString();
    }    
    if (n.length < 2) {
        return parseInt(n);
    }
​
    return sumDigits(
        n.split('')
         .reduce((acc, num) => acc += parseInt(num), 0)
    );
}