首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >判断输入是否是完美正方形的好算法是什么?

判断输入是否是完美正方形的好算法是什么?
EN

Stack Overflow用户
提问于 2008-12-05 13:35:31
回答 3查看 44.7K关注 0票数 94

可能重复:

Fastest way to determine if an integer's square root is an integer

查看一个数字是否为perfect square的方法是什么?

代码语言:javascript
复制
bool IsPerfectSquare(long input)
{
   // TODO
}

我使用的是C#,但这是语言不可知的。

清晰和简单的加分(这并不意味着代码高尔夫)。

编辑:这比我预想的要复杂得多!事实证明,双精度的问题在几个方面表现出来。首先,Math.Sqrt需要一个替身,它不能精确地保持长(谢谢Jon)。

其次,当你有一个巨大的,近乎完美的正方形时,双精度型的精度将丢失小的值( .000...00001)。例如,我的实现没有通过Math.Pow(10,18)+1的测试(我的报告为真)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-05 13:41:05

代码语言:javascript
复制
bool IsPerfectSquare(long input)
{
    long closestRoot = (long) Math.Sqrt(input);
    return input == closestRoot * closestRoot;
}

这可能会摆脱仅仅检查“是平方根是整数”的一些问题,但可能不是全部。你可能需要变得更时髦一点:

代码语言:javascript
复制
bool IsPerfectSquare(long input)
{
    double root = Math.Sqrt(input);

    long rootBits = BitConverter.DoubleToInt64Bits(root);
    long lowerBound = (long) BitConverter.Int64BitsToDouble(rootBits-1);
    long upperBound = (long) BitConverter.Int64BitsToDouble(rootBits+1);

    for (long candidate = lowerBound; candidate <= upperBound; candidate++)
    {
         if (candidate * candidate == input)
         {
             return true;
         }
    }
    return false;
}

很讨厌,而且对于除了非常大的值之外的任何东西都是不必要的,但我认为它应该可以工作…

票数 120
EN

Stack Overflow用户

发布于 2008-12-05 13:42:24

代码语言:javascript
复制
bool IsPerfectSquare(long input)
{
    long SquareRoot = (long) Math.Sqrt(input);
    return ((SquareRoot * SquareRoot) == input);
}
票数 12
EN

Stack Overflow用户

发布于 2008-12-05 13:45:56

在Common Lisp中,我使用以下代码:

代码语言:javascript
复制
(defun perfect-square-p (n)
  (= (expt (isqrt n) 2)
     n))
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/343852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档