2017-03-31 317 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);

相關問題