【问题标题】:What's the best way in JavaScript to test if a given parameter is a square number?JavaScript 中测试给定参数是否为平方数的最佳方法是什么?
【发布时间】:2015-09-04 07:31:14
【问题描述】:

我创建了一个函数来测试给定参数是否为平方数。

在此处了解平方数:https://en.wikipedia.org/?title=Square_number

如果数字是平方数,则返回true,否则返回false。负数也返回 false

例子:

isSquare(-12) // => false
isSquare( 5) // => false
isSquare( 9) // => true
isSquare(25) // => true
isSquare(27) // => false

目前,我正在使用这种方法:http://jsfiddle.net/marcusdei/ujtc82dq/5/

但是,有没有更短更干净的方法来完成工作?

【问题讨论】:

  • 引用的方法到底有什么问题?不会比那更短......(而且它也很干净,IMO)
  • 是的,我发现这个更短,但不确定是否更清洁:jsfiddle.net/marcusdei/ujtc82dq/7

标签: javascript numbers perfect-square


【解决方案1】:

试试这个:

var isSquare = function (n) {
    return n > 0 && Math.sqrt(n) % 1 === 0;
};
  1. 检查数字是否为正数
  2. 检查sqrt是否是完整的数字,即integer

Demo

【讨论】:

  • 我认为您不需要检查该值是否 > 0。从技术上讲,0 也是一个平方数。在您的情况下,它将评估为 false。
  • @mpn 对于 0 作为完美的正方形,你是对的。对于负数,可以保存一个函数调用。
  • n >= 0 && ... - 包括 0
【解决方案2】:

我肯定会去:

var isSquare = function (n) {
    return Math.sqrt(n) % 1 === 0;
};

PS:0 对于那些好奇的人来说是一个平方数

Demo

【讨论】:

    【解决方案3】:

    我认为这是一个更短更简洁的选择:

      var isSquare = function(n) {
    
      return Number.isInteger(Math.sqrt(n));
    };
    
    isSquare(25); //true
    
    

    比你可以使用的更短更干净:

    var isSquare = n => Number.isInteger(Math.sqrt(n));
    
    isSquare(25);//true
    

    【讨论】:

      【解决方案4】:

      //1st 
      var isPerfectSquare = function(num) {
         return Math.sqrt(num) % 1 === 0;
      }
      
      //2nd: loop through all the number from 1 to num 
      var isPerfectSquare = function(num) {
          
          for(let i=1; i <= num ; i++){
              let d = i * i;
              if(d === num){
                  return true
              }
          }
      }
      
      // Optimize solution: Binary Search 
      var isPerfectSquare = function(num) {
      
          if(num ==1)return true
          let left = 2;
          let right = Math.floor(num/2);
          while(left <= right){
              let middle = Math.floor((left + right)/2)
              let sqr = middle * middle;
              if(sqr == num){
                  return true
              }else{
                  if(sqr > num){
                    right = middle -1
                  }else{
                      left = middle + 1
                  }
              }  
          }
          
          return false
      };

      【讨论】:

        【解决方案5】:

        如果您在 JavaScript 中使用新的 BigInt,那就有点棘手了:

        // integer square root function (stolen from the interwebs)
        function sqrt(n) {
          let a = 1n;
          let b = (n >> 5n) + 8n;
          while (b >= a) {
            let mid = (a + b) >> 1n;
            if (mid * mid > n) {
              b = mid -= 1n;
            } else {
              a = mid += 1n;
            }
          }
          return a -= 1n;
        }
        
        sqrt(25n) === 5n
        sqrt(26n) === 5n
        ...
        sqrt(35n) === 5n
        

        我发现(到目前为止)确定 n 是否为正方形的最好和最快的方法是:

        function isSquare(n) {
           return n%sqrt(n) === 0n
        }
        

        但 BigInt 操作必须有更快的方法。

        【讨论】:

          【解决方案6】:

          我走了那条路:

          var isSquare = (n) => n === 0 ? true : n > 0 && Math.sqrt(n) % 1 === 0;
          
          console.log(isSquare(25));
          console.log(isSquare(10));
          console.log(isSquare(16));

          【讨论】:

            【解决方案7】:

            这 (Math.sqrt(number) % 1 === 0) 还不够吗?它只是检查数字的 sqrt 是否为整数,如果是,则它是一个完美的正方形。

            显然,根据您想对该信息做什么,它可能需要额外的代码。

            【讨论】:

            • 您好 AnonymousContribute,您的回答与 Stephane 的回答不一样吗:stackoverflow.com/a/49881377/5488275?如果是这样,请投票赞成这个答案,而不是添加您自己的 :)
            猜你喜欢
            • 1970-01-01
            • 2010-09-29
            • 1970-01-01
            • 1970-01-01
            • 2010-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多