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

Fra*_*zur 1 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;
}
Run Code Online (Sandbox Code Playgroud)

Nel*_*ira 13

这是另一种方法:

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

console.log(divisors(12));
Run Code Online (Sandbox Code Playgroud)

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'技巧'.情况是javascript中的布尔表达式不返回true或false.它们返回'truthy'或'falsy'值,然后转换为boolean.所以实际的返回值是&&的正确值(考虑到两者都必须是真实的)和为||找到的第一个thuthy值.(考虑到只需要一个人).所以这基本上意味着:如果a是模块化值(即!= 0)则返回a加总和,否则返回0.
  • , 0 是reduce计算的初始值.

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

编辑

回答特里斯坦前锋:

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);
Run Code Online (Sandbox Code Playgroud)

  • 另一个不使用reduce来查找除数的例子: `const divisors = (n) =&gt; [...Array(n + 1).keys()].slice(1).filter((i) =&gt; n %我=== 0);` (3认同)
  • @Kinduser这几天我发布了一个答案,答案只是改变了一个小问题,使一个非常糟糕的begginer的代码工作.有人发布了一个更高级的代码版本,并批评我没有做出更好的代码版本.我回答说人们必须分步学习.然而我想到了这一点,我意识到最好的将是两个答案.一个答案给鱼,另一个教授如何钓鱼.因此,基于此我想在为用户提供更高级的代码,因此OP可以有更高级的示例来达到更高.:) (2认同)

kin*_*ser 5

您必须检查指定的数字是否是给定整数的约数。您可以使用模%- 如果没有其余部分,指定的数字是给定整数的除数 - 将其添加到总和中。

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);
Run Code Online (Sandbox Code Playgroud)