[Codewars]-Integers: Recreation One
题目:
- 在
(m,n)
范围内,找出符合一下条件的数
k
:
-k
的约数的平方和
sum
是一个平方数
- 返回
[k,sum]
- 如:42的约数有
1, 2, 3, 6, 7, 14, 21, 42
,他们的平方是1, 4, 9, 36, 49, 196, 441, 1764
,和是2500,2500是50的平方。list_squared(1, 50)
返回[[1,1],[42,2500]]
思路:
解答:
function listSquared(m, n) {
var result = []
for(var i = m ; i <= n ; i ++){
var arr = getAllDivisors(i)
var divSqurt = isSqure(arr)
if(divSqurt){
result.push([i,divSqurt])
}
}
function getAllDivisors(num){
var tempArr = [1,num]
var max = num
for(let i=2; i < max ; i++){
if(isInt(num/i)){
max = num/i
tempArr.push(i,max)
}
}
return quChong(tempArr);
}
function isInt(n){
if(n%1==0){
return true
}else{
return false
}
}
function isSqure(arr){
var sum = arr.map(function(a){return a*a}).reduce(function(a,b){return a+b})
if( Math.sqrt(sum)%1==0 ){
return sum
}else{
return false;
}
}
function quChong(arr){
arr = arr.sort(function(a,b){return a-b})
for(var i = arr.length-1 ; i >= 1 ; i --){
if(arr[i]== arr[i-1]){
arr.splice(i,1)
}
}
return arr
}
return result
}
后记:
- 提交之后看见一个更厉害的
- 来自网友
skiff174
function listSquared(m, n) {
var arr = [];
for (var i = m; i <= n; i++){
var temp = 0;
for (var j = 1; j <= i; j++) {
if ( i % j == 0) temp += j*j;
};
if ( Math.sqrt(temp) % 1 == 0) arr.push([i, temp]);
};
return arr;
}