如何使用二分查找法求 8 的平方根?保留 6 位小数。
假设只精确到整数部分
如果我们只需要计算整数部分的话,那很好实现,假设要开平方的数为 value
,依次二分,直到找到某一个整数的平方小于等于 value
,然后这个整数加1的平方大于 value
,那这个数就是开平方结果的整数部分了。
下面为 PHP 实现代码:
function calcInteger($value, $low, $high)
{
$mid = round(($low + $high) / 2);
$mid2 = $mid * $mid;
if ($mid2 > $value) {
if (($mid - 1) * ($mid - 1) <= $value) return $mid - 1;
return calcInteger($value, 0, $mid);
} else if ($mid2 < $value) {
if (($mid + 1) * ($mid + 1) >= $value) return $mid;
return calcInteger($value, $mid, $high);
} else {
return $mid;
}
}
var_dump(calcInteger(8, 0, 8)); // 2
实现思路:
- 如果二分的中点的平方大于
value
,说明整数部分肯定位于中点之前。这个时候需要特别注意的是,不能直接