求x 的平方根
· 约 2 分钟阅读 · – 次阅读
leetcode
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4 输出:2 示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
二分查找的方法
在0和x中查找
func mySqrt(x int) int {
l, r := 0, x
ans := -1
for l <= r{
mid := l + (r-l)/2
if mid*mid <= x{
ans = mid
l = mid + 1
}else{
r = mid - 1
}
}
return ans
}
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x;
int ans = 0;
while (left <= right) {
long mid = left + (right - left) / 2;
if (mid * mid <= x) {
ans = mid;
left = mid + 1;
}else{
right = mid - 1;
}
}
return ans;
}
};
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x;
int accuracy = 0;
int ans = 0;
while (left <= right) {
long mid = left + (right - left) / 2;
if (mid * mid < x) {
left = mid + 1;
}else if (mid * mid > x){
right = mid - 1;
}else{
return mid;
}
}
cout << left << " " << right;
return right;
}
};
TODO:求非整数,比如精确到0.01
袖珍计算器算法
「袖珍计算器算法」是一种用指数函数 exp 和对数函数 ln 代替平方根函数的方法。我们通过有限的可以使用的数学函数,得到我们想要计算的结果。
x = e^lnx x^1/2 = e^(1/2 * lnx)
class Solution {
public:
int mySqrt(int x) {
// x = e^0.5*lnx
if (x == 0) return 0;
int ans = exp(0.5 * log(x));
// 浮点数计算存在误差,可能会算小了
return (long)(ans+1)*(ans+1) <= x ? ans + 1 : ans;
}
};
牛顿迭代法
class Solution {
public:
int mySqrt(int x) {
if (x == 0) return 0;
// 注意要申明为double,float精度不够,case:2147395599
double x0 = x, C = x;
while (true) {
// 构造函数y = x^2 - C; 取(x0, x0*x0 - C)这一点的切线,求其与x轴交点得到(0.5*(x0+c/x0)))
double x1 = 0.5 * (x0 + C / x0);
if (x0 - x1 < 1e-7) {
return int(x1);
}
x0 = x1;
}
}
};