【发布时间】:2022-02-04 18:28:13
【问题描述】:
我遇到了一种算法,可以在 O(logN) 时间内判断给定数字是否是完美平方。
这是这个想法的实现(JAVA)。
public boolean isPerfectSquare(long x) {
if (x <= 1)
return true;
long low = 1;
long high = x;
long mid = 0;
while (low <= high) {
mid = low + (high - low) / 2l;
if (mid * mid == x)
return true;
else if (mid * mid < x)
low = mid + 1;
else
high = mid - 1;
}
return false;
}
这适用于256、808201 等数字
但对于像999966000289 这样的数字则失败。
我不知道为什么?
【问题讨论】:
-
可能是因为 mid*mid 溢出了。
-
因为 C 中的数值类型有其局限性。你应该问自己,当你喂它
999966000289时,mid * mid是什么,它是否适合你正在使用的long类型。还有可能你的系统中的long甚至不能容纳999966000289本身。 -
现在说得通了。有没有办法检查大数的平方根属性?
-
@Insane_banda 考虑将
mid设为long long int。当您使用它时,您还可以对low、high、mid使用无符号类型,以获得另一个因子 2。 -
@pmg:当你接近根时,牛顿的方法是有效的。对于初始化,最好找到最接近的 4 的幂(很容易通过移位完成)并计算 2 的相同幂。
标签: java algorithm data-structures perfect-square