簡體   English   中英

JavaScript 中測試給定參數是否為平方數的最佳方法是什么?

[英]What's the best way in JavaScript to test if a given parameter is a square number?

我創建了一個函數來測試給定的參數是否是一個平方數。

在此處閱讀平方數: 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/

但是,是否有更短更清潔的方法來完成工作?

嘗試這個:

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

演示

我肯定會去:

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

PS:對於那些想知道的人來說, 0是一個平方數

演示

我認為這是一個更短更干凈的選擇:

  var isSquare = function(n) {

  return Number.isInteger(Math.sqrt(n));
};

isSquare(25); //true

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

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

isSquare(25);//true

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

如果您在 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 操作。

我走那條路:

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

這不是 (Math.sqrt(number) % 1 === 0) 基本上夠了嗎? 它只是檢查數字的 sqrt 是否是整數,如果是,則它是一個完美的正方形。

顯然,根據您想對這些信息做什么,它可能需要額外的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM