我正在做一些编码练习,但我无法解决这个问题.
求出给定整数的所有除数之和.对于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)
您必须检查指定的数字是否是给定整数的约数。您可以使用模%- 如果没有其余部分,指定的数字是给定整数的除数 - 将其添加到总和中。
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)