JavaScript 中测试给定参数是不是为平方数的最佳方法是啥?
Posted
技术标签:
【中文标题】JavaScript 中测试给定参数是不是为平方数的最佳方法是啥?【英文标题】:What's the best way in JavaScript to test if a given parameter is a square number?JavaScript 中测试给定参数是否为平方数的最佳方法是什么? 【发布时间】:2015-09-04 07:31:14 【问题描述】:我创建了一个函数来测试给定参数是否为平方数。
在此处了解平方数: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/
但是,有没有更短更干净的方法来完成工作?
【问题讨论】:
引用的方法到底有什么问题?不会比那更短......(而且它也很干净,IMO) 是的,我发现这个更短,但不确定是否更清洁:jsfiddle.net/marcusdei/ujtc82dq/7 【参考方案1】:试试这个:
var isSquare = function (n)
return n > 0 && Math.sqrt(n) % 1 === 0;
;
-
检查数字是否为正数
检查
sqrt
是否是完整的数字,即integer
Demo
【讨论】:
我认为您不需要检查该值是否 > 0。从技术上讲,0 也是一个平方数。在您的情况下,它将评估为 false。 @mpn 对于0
作为完美的正方形,你是对的。对于负数,可以保存一个函数调用。
n >= 0 && ...
- 包括 0【参考方案2】:
我肯定会去:
var isSquare = function (n)
return Math.sqrt(n) % 1 === 0;
;
PS:0
对于那些好奇的人来说是一个平方数
Demo
【讨论】:
【参考方案3】:我认为这是一个更短更简洁的选择:
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】://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
;
【讨论】:
【参考方案5】:如果您在 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 操作必须有更快的方法。
【讨论】:
【参考方案6】:我走了那条路:
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));
【讨论】:
【参考方案7】:这 (Math.sqrt(number) % 1 === 0) 还不够吗?它只是检查数字的 sqrt 是否为整数,如果是,则它是一个完美的正方形。
显然,根据您想对该信息做什么,它可能需要额外的代码。
【讨论】:
您好 AnonymousContribute,您的回答与 Stephane 的回答不一样吗:***.com/a/49881377/5488275?如果是这样,请投票赞成这个答案,而不是添加您自己的 :)以上是关于JavaScript 中测试给定参数是不是为平方数的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章