描述:
Implement int sqrt(int x).
Compute and return the square root of x.
思路:
按题意来说是实现一个api方法,对整数开根号
1.用二分的方法来对一个整数开根号,每次循环求start和end之间的值mid来计算,若mid*mid>x,则end变为mid,若mid*mid<x,则start取mid,直至mid*mid=x
2.对于1中的思路有两个不足的地方,假如x为99呢,mid*mid永远不可能为99,因为sqrt(99)==9,而当mid变的很大时mid*mid直接就溢出了
3.对于2.种提到的不足之处,可用(mid==start||mid==end)来弥补,当mid==start或mid==end任何一个条件满足即可。而mid*mid溢出的问题可以用x/mid mid来解决
4.对整数开根号能不能升级为对float、double类型的数据开根号呢,当然可以,判断条件只需要x/mid-mid小于某个数(也就是精度)即可。
代码:
Demo版本:
public int mySqrt(int x)
{
if (x < 0)
return -1;
int start = 0, end = x, mid=x/2;
if(x*x==x)//to judge the number 1
return x;
long tempNum = 0,tempMid=0;
while (mid!= start && mid!= end)
{
tempMid=mid;
tempNum=tempMid*tempMid;
if (tempNum<x)
{
start=mid;
mid =(mid+ end) / 2 ;
}
else if (tempNum>x)
{
end=mid;
mid =(mid+ start) / 2 ;
}else
break;
}
return mid;
}
改进版本:
public int mySqrt(int x)
{
if (x < 0)
return -1;
int start = 0, end = x, mid=x/2;
if(x*x==x)//to judge the number 1
return x;
int tempNum = 0,tempMid=0;
while (mid!= start && mid!= end)
{
tempMid=mid;
tempNum=x/tempMid-tempMid;
if (tempNum>0)
{
start=mid;
mid =(mid+ end) / 2 ;
}
else if (tempNum<0)
{
end=(int)mid;
mid =(mid+ start) / 2 ;
}else if(tempNum==0) {
break;
}
}
return mid;
}