LintCode x的平方根
2015-10-05 20:23
281 查看
x的平方根
实现 int sqrt(int N) 函数,计算并返回 N 的平方根。
样例
sqrt(3) = 1
sqrt(4) = 2
sqrt(5) = 2
sqrt(10) = 3
挑战
O(log(x))
solution: 如果使用蛮力法来求解的话,肯定是会超时的。因此,我们需要使用牛顿迭代法来求解这问题
牛顿迭代法: 对于给定一个函数f(x) = 0,的解为x0x_{0};那么我们可以通过牛顿迭代的方法来求解x0x_{0}, 其迭代公式为:
xk+1=xkx_{k+1} = x_{k} - f(xk)f′(xk)\frac{f(x_{k})}{f'(x_{k})}
当xk+1−xk<ϵx_{k+1} - x_{k} < \epsilon 时停止迭代, ϵ\epsilon为精度, xkx_{k}的初始值一般取0,或者1。
在本题中取f(x)=x2−Nf(x) = x^{2} - N,因此我们有:
xk+1=xk−x2k−N2∗xkx_{k+1} = x_{k} - \frac{x_{k}^{2} - N}{2*x_{k}}
化简得:
xk+1=12(xk+Nxk)x_{k+1} = \frac{1}{2}(x_{k} + \frac{N}{x_{k}})
code :
实现 int sqrt(int N) 函数,计算并返回 N 的平方根。
样例
sqrt(3) = 1
sqrt(4) = 2
sqrt(5) = 2
sqrt(10) = 3
挑战
O(log(x))
solution: 如果使用蛮力法来求解的话,肯定是会超时的。因此,我们需要使用牛顿迭代法来求解这问题
牛顿迭代法: 对于给定一个函数f(x) = 0,的解为x0x_{0};那么我们可以通过牛顿迭代的方法来求解x0x_{0}, 其迭代公式为:
xk+1=xkx_{k+1} = x_{k} - f(xk)f′(xk)\frac{f(x_{k})}{f'(x_{k})}
当xk+1−xk<ϵx_{k+1} - x_{k} < \epsilon 时停止迭代, ϵ\epsilon为精度, xkx_{k}的初始值一般取0,或者1。
在本题中取f(x)=x2−Nf(x) = x^{2} - N,因此我们有:
xk+1=xk−x2k−N2∗xkx_{k+1} = x_{k} - \frac{x_{k}^{2} - N}{2*x_{k}}
化简得:
xk+1=12(xk+Nxk)x_{k+1} = \frac{1}{2}(x_{k} + \frac{N}{x_{k}})
code :
class Solution { public: /** * @param x: An integer * @return: The sqrt of x */ int sqrt(int x) { double i = 1, j; do { j = (i + x / i) * 0.5; if (abs(j -i) < 1) return (int) j; i = j; } while (1); return 1; } };
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 游戏开发散记
- Remove Duplicates from Sorted Array
- numpy 安装错误
- [C++] Variable/Hex conversion
- 浅谈C++多态性
- 归一化方法总结
- 黑马程序员—OC语言小知识点及示例
- 数组连续子数组的和最大
- 浅谈C++多态性
- 操作系统之处理机管理
- HLG 1039 修路 二分
- 【static&extern】c语言static用法
- velocity自定义动画
- 病毒侵袭持续中---hdu3065(AC自动机模板)
- 【PAT】1003. Emergency (25)
- C++学习–应用篇(Windows/Linux)(书籍推荐及分享)
- 项目成本管理总结
- QT5 学习之路22---事件过滤器
- Matlab-vision包学习-Object Detection and Recognition-标记正例