题目:
Implement int sqrt(int x)
.
Compute and return the square root of x.
做这道题目,做的真拙计。一开始想到了《最优化理论》里面的类似于二分法的方法,结果竟然超时。十分不解,后来换成了牛顿切线法,表示貌似我实现的是有问题的,我实现没有使用浮点数,在某些输入的情况下是有死循环的。google了之后,结果让我大跌眼镜,竟然是使用了浮点数的牛顿切线法。好吧,不过貌似在学《最优化理论》的时候牛顿切线法的收敛速度是要比那个二分法快的,长记性了。
int sqrt(int x) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (x<0) return -1;
else if (x==0) return 0;
else if (x==1 || x==2 || x==3) return 1;
else if (x==4) return 2;
double start=2;
double next=(start+x/start)/2;
while (abs(start*start-x)>0.0001)
{
start=next;
next=(start+x/start)/2;
}
return (int)start;
}
在google的时候,又发现了一个据说是 最快的开根号的计算方法,竟然是取了一个很变态的初始值的牛顿切线法。
//计算 1 / sqrt(x)
float InvSqrt(float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating VALUE
i = 0x5f375a86- (i>>1); // gives initial guess y0
x = *(float*)&i; // convert bits BACK to float
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
return x;
}
看来老祖宗的东西还是没过时的。