给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
时间: 2023-02-06 21:25:44 浏览: 130
你可以使用二分法来解决这个问题。
首先,设置两个变量 left 和 right,分别表示算术平方根的下界和上界。然后,可以使用下面的公式来计算算术平方根的值:
mid = (left + right) / 2
然后,根据结果的大小来更新 left 和 right:
- 如果 mid * mid > x,则更新 right = mid - 1
- 如果 mid * mid < x,则更新 left = mid + 1
- 否则,mid 就是算术平方根的值
然后,重复上述过程,直到 left 和 right 相等。最后,返回 left 或 right 即可。
这里是一个示例代码:
```
def mySqrt(x: int) -> int:
left, right = 0, x
while left <= right:
mid = (left + right) // 2
if mid * mid > x:
right = mid - 1
elif mid * mid < x:
left = mid + 1
else:
return mid
return left
```
请注意,上述代码是基于 Python 3 编写的,如果你使用的是其他语言,可能需要做一些调整。
相关问题
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5)...
好的,这是一道比较经典的算法题。可以使用二分查找的思想来解决这个问题。具体步骤如下:
1. 定义左右边界,分别为 0 和 x。
2. 在左右边界之间进行二分查找,每次将中间值 mid 的平方与 x 进行比较。
3. 如果 mid 的平方小于等于 x,则将左边界 left 更新为 mid + 1。
4. 如果 mid 的平方大于 x,则将右边界 right 更新为 mid - 1。
5. 最终的结果为右边界 right。
下面是 C++ 代码实现:
```cpp
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x;
while (left <= right) {
long mid = left + (right - left) / 2;
if (mid * mid <= x) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return right;
}
};
```
注意,这里的 mid 需要用 long 类型来存储,否则可能会出现溢出的情况。
Go编写x的平方根 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 输入格式: 大于0小于2^32-1 输出格式: 返回类型是整数,小数部分将被舍去 输入样例: 8 输出样例: 2
好的,这是一个求平方根的编程问题,下面是 Go 语言的代码实现:
```go
package main
import "fmt"
func mySqrt(x int) int {
if x == 0 {
return 0
}
left, right := 1, x
for left <= right {
mid := left + (right-left)/2
if mid*mid == x {
return mid
} else if mid*mid < x {
left = mid + 1
} else {
right = mid - 1
}
}
return right
}
func main() {
var x int
fmt.Scan(&x)
fmt.Println(mySqrt(x))
}
```
我们可以使用二分查找的思想来实现求平方根的算法。首先判断特殊情况,如果 x 等于 0,则直接返回 0。接着使用二分查找的方法,将平方根的范围缩小到 1 到 x 之间,每次取中间的数字 mid,计算 mid 的平方,如果 mid 的平方等于 x,则直接返回 mid。如果 mid 的平方小于 x,则说明平方根在 mid 的右侧,将左边界 left 调整为 mid+1。如果 mid 的平方大于 x,则说明平方根在 mid 的左侧,将右边界 right 调整为 mid-1。循环查找,直到找到平方根所在的数字,最后返回右边界 right 即可。