当前位置: 面试刷题>> x 的平方根(经典算法150题)


题目描述

给定一个非负整数x,编写一个函数来计算并返回x的平方根,结果保留到小数点后两位。要求不使用内置的平方根函数,如Python的math.sqrt()、JavaScript的Math.sqrt()或PHP的sqrt()等。

示例

输入x = 4 输出2.00

输入x = 8 输出2.83(注意:这里的结果保留两位小数,实际平方根为2.8284...)

解题思路

我们可以使用二分查找法来逼近平方根的值。由于平方根函数是单调递增的,我们可以设定一个搜索范围,初始时范围从0到x,然后不断缩小这个范围,直到找到满足条件的平方根值(或者足够接近的值)。

PHP代码示例

function mySqrt($x) {
    if ($x == 0) return 0.00;
    
    $left = 0;
    $right = $x;
    $precision = 0.01; // 设定精度
    
    while ($left + $precision < $right) {
        $mid = $left + ($right - $left) / 2;
        $square = $mid * $mid;
        
        if ($square == $x) {
            return round($mid, 2);
        } elseif ($square < $x) {
            $left = $mid;
        } else {
            $right = $mid;
        }
    }
    
    // 当循环结束时,left 和 right 足够接近,取 left 或 right 均可
    return round($right, 2);
}

echo mySqrt(4); // 输出 2.00
echo mySqrt(8); // 输出 2.83

Python代码示例

def mySqrt(x):
    if x == 0:
        return 0.00
    
    left, right = 0, x
    precision = 0.01
    
    while left + precision < right:
        mid = (left + right) / 2
        square = mid * mid
        
        if square == x:
            return round(mid, 2)
        elif square < x:
            left = mid
        else:
            right = mid
    
    return round(right, 2)

print(mySqrt(4))  # 输出 2.00
print(mySqrt(8))  # 输出 2.83

JavaScript代码示例

function mySqrt(x) {
    if (x === 0) return 0.00;
    
    let left = 0;
    let right = x;
    const precision = 0.01;
    
    while (left + precision < right) {
        const mid = (left + right) / 2;
        const square = mid * mid;
        
        if (square === x) {
            return +mid.toFixed(2);
        } else if (square < x) {
            left = mid;
        } else {
            right = mid;
        }
    }
    
    return +right.toFixed(2);
}

console.log(mySqrt(4)); // 输出 2.00
console.log(mySqrt(8)); // 输出 2.83

以上代码示例均实现了不使用内置平方根函数来计算非负整数x的平方根,并保留两位小数。

推荐面试题