二分法求开方,比较简单,如果找到更加快速的方法就更好了。有如下几种,迭代牛顿法、另外一种有cramack提出的办法。
这里只列出我的二分法,其他方法我专门找一次总结。
int fun(int c,int x)
{
if(x/c==c)return 0;
return (x/c)>c?-1:1;
}
int mySqrt(int x) {
long long temp = x;
//if(temp>INT_MAX)x = INT_MAX;
//cout<<x<<endl;
double res;
int left,right,mid=0;
left = 1,right=x;
int l,r,m;
if(x==1)return 1;
else if(x==0)return 0;
while(left<=right){
//cout<<left<<" "<<right<<endl;
mid=(left+right)/2;
m = fun(mid,x);
if(m==0)return mid;
else if(m<0)left=mid+1;
else if(m>0)right=mid-1;
}
//cout<<r<<l<<endl;
return right;
}