描述:
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-23 02:53:18