web-dev-qa-db-ja.com

JavaScriptで、指定されたパラメーターが平方数かどうかをテストする最良の方法は何ですか?

特定のパラメーターが平方数であるかどうかをテストする関数を作成しました。

ここで平方数についてお読みください: 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/

しかし、仕事を終わらせるためのより短いよりクリーンな方法はありますか?

9
Mike. D

これを試して:

var isSquare = function (n) {
    return n > 0 && Math.sqrt(n) % 1 === 0;
};
  1. 数値が正かどうかを確認
  2. sqrtが完全な番号かどうかを確認します。つまり、integer

デモ

30
Tushar

私は間違いなく行きます:

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

PS:0は、疑問に思う方のための平方数です。

デモ

5
Stephane Moreau

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の操作を高速化する方法が必要です。

0
Jeff Lowery

私はこれがより短くてきれいなオプションだと思います:

  var isSquare = function(n) {

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

isSquare(25); //true

あなたが使用できるものよりもさらに短くてきれいな場合:

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

isSquare(25);//true
0
A.McLoof

これ(Math.sqrt(number)%1 === 0)は基本的に十分ではありませんか?数値の平方根が整数かどうかをチェックするだけです。整数の場合、それは完全な正方形です。

明らかに、その情報をどのように処理するかに応じて、追加のコードが必要になる場合があります。

0