您的位置:首页 > 其它

leetcode:Sqrt(x)

2013-04-03 19:24 393 查看
题目:

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;
}


看来老祖宗的东西还是没过时的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: