检查一个数字是否是完美的正方形?

Sah*_*een 5 c++

我认为以下代码存在精度问题:

bool isPerfectSquare(long long n){
    long long squareRootN=(long long)(sqrt(n)+0.5);

    return squareRootN*squareRootN == n;
}
Run Code Online (Sandbox Code Playgroud)

怎么解决? PS:1 <= n <= 10 ^ 10

Sqrt(4)可以返回1.9999 => 1,所以我加0.5,使得它在四舍五入时变为2.注意:sqrt返回浮点数.

这是我发现的解释,但仍然无法修复代码:

嗨,似乎你也是浮点值的受害者.如果可能,您应该始终避免浮点比较.随着数字范围的增加,情况变得更糟.比如,当你指定浮动a = 4.0时,它存储为4.000 ... 01111或3.999999 ... 9978或类似.因此,每当您还将一个平方根键入int时,请务必小心.这些类型的错误的可能性随着整数范围的增加而增加.

Sam*_*Sam -2

long long是整数类型。所以,你的 +0.5 在截断中丢失了。

  • 我认为这是不正确的,因为 sqrt 函数返回一个浮点值。 (2认同)