leetcode:Sqrt(x)
2013-04-03 19:24
393 查看
题目:
Implement
Compute and return the square root of x.
做这道题目,做的真拙计。一开始想到了《最优化理论》里面的类似于二分法的方法,结果竟然超时。十分不解,后来换成了牛顿切线法,表示貌似我实现的是有问题的,我实现没有使用浮点数,在某些输入的情况下是有死循环的。google了之后,结果让我大跌眼镜,竟然是使用了浮点数的牛顿切线法。好吧,不过貌似在学《最优化理论》的时候牛顿切线法的收敛速度是要比那个二分法快的,长记性了。
在google的时候,又发现了一个据说是最快的开根号的计算方法,竟然是取了一个很变态的初始值的牛顿切线法。
看来老祖宗的东西还是没过时的。
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; }
看来老祖宗的东西还是没过时的。
相关文章推荐
- Leetcode——69. Sqrt(x)
- leetcode_69题——Sqrt(x)(二分查找,还有个溢出问题的研究)
- leetcode 二分查找 Sqrt(x)
- [leetcode] 69. Sqrt(x) 解题报告
- leetcode -- Sqrt(x)
- [leetcode]: 69. Sqrt(x)
- [LeetCode] Sqrt(x)
- leetcode笔记:Sqrt(x)
- [Leetcode]69. Sqrt(x)
- LeetCode | Sqrt(x)
- [LeetCode]69 Sqrt(x)
- LeetCode Online Judge 题目C# 练习 - Sqrt(x)
- Leetcode: Sqrt(x)
- 【LeetCode】69. Sqrt(x)
- leetcode 69 Sqrt(x)
- [LeetCode] Sqrt(x)
- leetcode 069 Sqrt(x)
- leetcode69---Sqrt(x)(求x的平方根)
- leetcode-69. Sqrt(x)
- [LeetCode]Sqrt(x)