我正在做一些编码练习,但我无法解决这个问题。
求出给定整数的所有除数之和。 对于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;
}
答案 0 :(得分:11)
这是另一种方法:
var divisors = n=>[...Array(n+1).keys()].slice(1)
.reduce((s, a)=>s+(!(n % a) && a), 0);
console.log(divisors(12));
&#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
修改强>
回答特里斯坦前锋:
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;
答案 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
}