web-dev-qa-db-fra.com

Quelle est la meilleure façon en JavaScript pour tester si un paramètre donné est un nombre carré?

J'ai créé une fonction qui testera pour voir si un paramètre donné est un nombre carré.

Lisez à propos des nombres carrés ici: https://en.wikipedia.org/?title=Square_number

Si le nombre est un nombre carré, il renvoie vrai et sinon faux . Les nombres négatifs renvoient également false .

Exemples:

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

En ce moment, j'utilise cette méthode: http://jsfiddle.net/marcusdei/ujtc82dq/5/

Mais, existe-t-il un moyen plus court et plus propre de faire le travail?

9
Mike. D

Essaye ça:

var isSquare = function (n) {
    return n > 0 && Math.sqrt(n) % 1 === 0;
};
  1. Vérifiez si le nombre est positif
  2. Vérifiez si sqrt est un nombre complet, c'est-à-dire integer

Démo

30
Tushar

Je choisirais certainement:

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

PS: 0 est un nombre carré pour ceux qui se demandent

Démo

5
Stephane Moreau

C'est un peu plus compliqué si vous utilisez le nouveau BigInt en JavaScript:

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

Le moyen le meilleur et le plus rapide que j'ai trouvé (jusqu'à présent) pour déterminer si n est un carré est:

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

Mais il doit y avoir un moyen plus rapide pour les opérations BigInt.

0
Jeff Lowery

Je pense que celui-ci est une option plus courte et plus propre:

  var isSquare = function(n) {

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

isSquare(25); //true

pour encore plus court et plus propre que celui que vous pourriez utiliser:

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

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

N'est-ce pas (Math.sqrt (nombre)% 1 === 0) fondamentalement suffisant? il vérifie simplement si le sqrt du nombre est un nombre entier, si c'est le cas, alors c'est un carré parfait.

Évidemment, selon ce que vous voulez faire avec ces informations, cela peut nécessiter du code supplémentaire.

0