LeetCode_Sqrt
来源:互联网 发布:iscroll lite.js 官网 编辑:程序博客网 时间:2024/05/22 09:51
Implement int sqrt(int x)
.
Compute and return the square root of x.
class Solution {public: int sqrt(int x) { // Start typing your C/C++ solution below // DO NOT write int main() function if (x == 0) return 0; int i = 0; int j = x; while (i + 1 < j) { int mid = i + ((j - i) >> 1); if (mid > (x / mid)) { j = mid; continue; } int tmp = mid * mid; if (tmp == x) return mid; else if (tmp < x) i = mid; else j = mid; } if (x / j == j) return j; return i; }};
为了方便理解,就先以本题为例:
计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如左图所示。
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
判断xi是否是f(x)=0的解有两种方法:
一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。
继续化简,xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。
int sqrt(int x) { if (x == 0) return 0; double last = 0; double res = 1; while (res != last) { last = res; res = (res + x / res) / 2; } return int(res); }
double sqrt(double x) { if (x == 0) return 0; double last = 0.0; double res = 1.0; while (res != last) { last = res; res = (res + x / res) / 2; } return res; }
- LeetCode_Sqrt
- leetcode_Sqrt(x)
- P2P技术原理及应用
- linux上流量控制的相关文章
- android中如何获得webView中的内容
- cocos2d-x 流程和一些类的使用总结
- 解决IE6中ajax ‘aborted’错误请求中断
- LeetCode_Sqrt
- iptables
- C++ 虚函数表解析
- Linux写时拷贝技术(copy-on-write)
- Android开发(25)--framebyframe帧动画并实现启动界面到主界面的跳转
- Ubuntu下利用系统创建xorg.conf文件
- 【三星 I9100 在android的状态栏(statusbar)中增加快捷键的方法 】
- Shell脚本实现远程MySQL自动查询
- Hibernate从入门到精通(四)基本映射