javaScript - 查找给定整数的所有除数之和

时间:2017-03-31 22:21:53

标签: javascript math

我正在做一些编码练习,但我无法解决这个问题。

求出给定整数的所有除数之和。 对于n = 12,输入应为 sumOfDivisors(n)= 28。

示例:1 + 2 + 3 + 4 + 6 + 12 = 28。

约束: 1≤n≤15。

我该怎么解决这个练习?我无法做到。

function(n){
    var arr = [],
        finalSum;

    if(n <= 1 || n => 16){
       return false ;   
   }
   for(var i = 0; i < n; i++){
       var tmp= n/2;
       arr.push(tmp)    
       // i need to keep on dividing n but i can't get the way of how to
   }
  return finalSum;
}

3 个答案:

答案 0 :(得分:11)

这是另一种方法:

&#13;
&#13;
var divisors = n=>[...Array(n+1).keys()].slice(1)
   .reduce((s, a)=>s+(!(n % a) && a), 0);

console.log(divisors(12));
&#13;
&#13;
&#13;

JSFiddle:https://jsfiddle.net/32n5jdnb/141/

解释

  • n=>这是一个箭头函数,相当于function(n){。如果只有一个参数,你就不需要()。
  • Array(n+1)创建一个n + 1个元素的空数组
  • .keys()获取空数组的键(索引,即0,1,2),这是一种创建数字序列的方法
  • [...Array(n+1)].keys()]使用spread(...)运算符转换另一个数组中的迭代器,以便创建一个带有数字序列的数组
  • .slice(1)删除第一个元素,从而创建一个以1开头的序列。记住n + 1?
  • .reduce()是一种方法,它迭代每个元素并计算一个值,以便将数组减少到一个值。它接收回调函数作为参数来计算计算的值和初始值
  • (s, a)=>是reduce的回调函数。它是一个等同于函数(s,a){
  • 的箭头函数
  • s+(!(n % a) && a)是值的计算。
  • s+ s(总和)或最后计算的值+
  • !(n % a)仅对模块值为0的元素返回true。
  • (!(n % a) && a)是一个js&#39;诀窍&#39;。情况是javascript中的布尔表达式不会返回true或false。他们返回了一个真正的“真实”。或者&#39; falsy&#39;然后将值转换为布尔值。所以实际的返回值是&amp;&amp;的正确值。 (考虑到两者都必须是真实的)并且为||找到第一个thuthy值(考虑到只需要一个人)。所以这基本上意味着:如果a是模块化值(即!= 0),则返回a添加到总和,否则返回0.
  • , 0是reduce计算的初始值。

减少文档:https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

修改

回答特里斯坦前锋:

&#13;
&#13;
var divisorsList = [];
var divisors = (n)=>[...Array(n+1).keys()].slice(1)
       .reduce((s, a)=>{
          var divisor = !(n % a) && a;
          if (divisor) divisorsList.push(divisor);
          return s+divisor;
       }, 0);
    

console.log('Result:', divisors(12));
console.log('Divisors:', divisorsList);
&#13;
&#13;
&#13;

答案 1 :(得分:3)

您必须检查指定的数字是否是给定整数的除数。你可以使用modulo % - 如果没有休息,指定的数字是给定整数的除数 - 将它加到总和中。

function sumDivisors(num){
  var sum = 0;
  for (var i = 1; i <= num; i++){
    if (!(num % i)) {
      sum += i;
    }
  }
  console.log(sum);
}

sumDivisors(6);
sumDivisors(10);

答案 2 :(得分:0)

这是算法性能更好的解决方案(O(sqrt(n的最大素数)))

divisors = n => {
  sum = 1
  for (i = 2; n > 1; i++) {
    i * i > n ? i = n : 0
    b = 0
    while (n % i < 1) {
      c = sum * i
      sum += c - b
      b = c
      n /= i
    }
  }
  return sum
}