当前位置: 面试刷题>> 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代码示例
```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代码示例
```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代码示例
```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`的平方根,并保留两位小数。