[Codewars]-Integers: Recreation One

17 篇文章 0 订阅
12 篇文章 0 订阅

[Codewars]-Integers: Recreation One

题目:
  • (m,n) ( m , n ) 范围内,找出符合一下条件的数k
    -k的约数的平方和 sum s u m 是一个平方数
  • 返回 [k,sum] [ k , s u m ]
  • 如: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
        }
    }
    //判断是否是平方数,若不是,返回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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值