题目描述:
Implement int sqrt(int x)
.
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
思路:
1.整数x开根号后的结果肯定在0-x之间所以可以对0-x进行二分查找;
实现:
class Solution {
public int mySqrt(int x) {
int low=0;
int high=x;
while(low<=high){
long mid=(low+high)/2;
if(mid*mid==x){
return (int)mid;
}else if(mid*mid<x){
low=(int)mid+1;
}else{
high=(int)mid-1;
}
}
return high;
}
}
扩展题:
输入整数x,输出开根号的结果,保留精度0.00001。
方法一:二分法
用二分法逐步缩小范围,每次将mid的平方与目标值进行比较,看它们的差是否小于精度,若小于精度,则退出循环,返回mid的值,否则,用二分的方式缩小范围。
实现:
private double sqrt(double n){
double start=0.0;
double end=n;
double p=1e-2;//精度要求
double mid=(start+end)/2.0;
while(Math.abs(mid*mid-n)>p){//浮点数之差的绝对值和精度进行比较
if(mid*mid<n){
start=mid;
}else if(mid*mid>n){
end=mid;
}else{
return mid;
}
mid=(start+end)/2.0;
}
return mid;}
如果保留小数点后三位,则返回Math.round(mid*1000)/1000.0;
有精度要求时,直接将mid*mid的值与精度进行比较作为循环继续的条件。最后退出时,直接返回mid就是满足精度条件的数。如果要求保留小数点后多少位的话,则需要使用math,round()
方法二、牛顿法
实现:
//牛顿法
private double sqrt2(int n){
double x=1.0;//设置初始值
double p=1e-5;
while(Math.abs(x*x-n)>p){
x=(x+(n/x))/2.0;
}
return x;
}