LeetCode/x的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被舍去 。
1. 暴力法
class Solution {
public:
int mySqrt(int x) {
for(int i=1;i<=x;i++){
int val = x/i;//防止int溢出
if(val==i) return i;
else if(val<i) return i-1;
}
return 0;
}
};
2. 二分法
在暴力法的基础上二分优化
class Solution {
public:
int mySqrt(int x) {
int left = 1; int right = x;
int ans = 0;
while(left<=right){//二分法
int mid = (left-right)/2+right;//防止int溢出
int val = x/mid;//防止溢出用除法
if(val==mid) return mid;
else if(val<mid) right = mid-1;//
else {left = mid+1; ans=mid;}//每次更新记录平方小于x的值
}
return ans;
}
};
3. 牛顿迭代法
建立并求取下面方程的根$$f(x)=x^2-C$$
迭代公式为$$x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}=\frac{x_k+\frac{C}{x_k}}{2}$$
初值取C
class Solution {
public:
int mySqrt(int x) {
if (x == 0)
return 0;
double C = x, x0 = x;//x0初值取C
while (true) {//迭代
double xi = 0.5 * (x0 + C / x0);//迭代公式
if (fabs(x0 - xi) < 1e-5) {//精度限制
break;
}
x0 = xi;//更新x
}
return int(x0);//向下取整
}
};