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
如果数字是平方数,则它 returns true 否则 false。负数也 return 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;
};
- 检查数字是否为正数
- 检查
sqrt
是否完整,即 integer
我肯定会选择:
var isSquare = function (n) {
return Math.sqrt(n) % 1 === 0;
};
PS: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 操作必须有更快的方法。
这个(Math.sqrt(number) % 1 === 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
};
我走了那条路:
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));
我创建了一个函数来测试给定参数是否为平方数。
在此处阅读有关平方数的信息:https://en.wikipedia.org/?title=Square_number
如果数字是平方数,则它 returns true 否则 false。负数也 return 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;
};
- 检查数字是否为正数
- 检查
sqrt
是否完整,即integer
我肯定会选择:
var isSquare = function (n) {
return Math.sqrt(n) % 1 === 0;
};
PS: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 操作必须有更快的方法。
这个(Math.sqrt(number) % 1 === 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
};
我走了那条路:
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));