2017-03-31 195 views
0

我在做一些编码练习,但我无法解决这个问题。javaScript - 查找给定整数的所有因数的总和

查找给定整数的所有除数的和。 对于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; 
} 

回答

5

这是另一种方式来做到这一点:

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

 
console.log(divisors(12));

的jsfiddle:https://jsfiddle.net/32n5jdnb/2/

Explaini NG:

  • (n)=>这是箭头功能,等效的功能(N){
  • Array(n+1)创建n + 1个元素的空数组
  • .keys()得到一个迭代符的空数组的键(索引,即0,1,2),所以这是创建一个数值序列
  • [...Array(n+1)].keys()]利用扩频(...)运算来转换迭代在另一个阵列以便创建与所述数字序列的阵列的方式
  • .slice(1)删除第一个元素,从而创建一个从1开始的序列。记住n + 1?
  • .reduce()是一种迭代通过每个元素并计算值以将数组减少为一个值的方法。它接收参数作为回调函数来计算值和计算的初始值
  • (s, a)=>是reduce的回调函数。它是一个等价于函数(s,a)的箭头函数。{
  • s+(!(n % (a)) && a)是值的计算。 (对于总和)
  • s+ S或计算+
  • (!(n % (a))这仅对于具有0作为模块化值
  • (!(n % (a)) && a)的元素返回true的最后一个值是一个js“特技”。这种情况是,在JavaScript中的布尔表达式不返回true或false。他们返回一个“truthy”或“falsy”值,然后转换为布尔值。所以实际返回的值是& &的最后一个真值,并且是||的第一个真值。所以这基本上意味着:如果a是模数值返回a加上总和,否则返回0.
  • , 0是减少计算的初始值。

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

+3

难以置信的可读性。 – destoryer

+1

我还没有完成! :D –

+1

现在完成了!看看:) –

2

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

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);

相关问题