JavaScript中测试给定参数是否为方数的最佳方法是什么?

时间:2015-06-18 15:05:45

标签: javascript numbers perfect-square

我创建了一个函数,用于测试给定参数是否为方数。

在此处阅读方括号: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/

但是,是否有更简洁,更清洁的方式来完成工作?

7 个答案:

答案 0 :(得分:26)

试试这个:

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

答案 1 :(得分:4)

我肯定会选择:

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

PS:0对于那些想知道

的人来说是一个正方形数字

Demo

答案 2 :(得分:2)

//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
};

答案 3 :(得分:1)

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

  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 :(得分:0)

如果您在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操作必须有一种更快的方法。

答案 5 :(得分:0)

(Math.sqrt(number)%1 === 0)基本上不够吗?它只是检查数字的平方是否是整数,如果是,那么它是一个理想的平方。

很显然,根据您要处理的信息,可能需要额外的代码。

答案 6 :(得分:0)

我走了那条路:

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));