Implement int sqrt(int x).

这道题本质上是求sqrt(x)下最大的整数。二分查找是比较容易想到的方法。另,在网上又学习了下别人的牛顿迭代法。

这是我原来的写法,写入是错误的,复杂度太高

class Solution {
public:int sqrt(int x) {if (x <= 0)return 0;if (x == 0 || x == 1)return x;long long start = 1;long long end = x >> 1;int index = start;while (start <= end){index = (start + end) >> 1;if (index*index == x)return index;else{if (end*end <= x)return end;if (end - start == 1)return start;if (index*index > x)end = index - 1;if (index*index < x)start = index ;}}return index;}
};

其实二分查找的思想是对的,只不过在某些小细节上海需要尤为注意一下。

标准代码可以这么写:

class Solution {
public:int sqrt(int x) {long long i = 0;long long j = x / 2 + 1;while (i <= j){long long mid = (i + j) / 2;long long sq = mid * mid;if (sq == x)return mid;else if (sq < x)i = mid + 1;elsej = mid - 1;}return j;}
};

完美的考虑了溢出的问题。这是我应该好好学习的地方。

牛顿迭代发解题

有此方法,可得到迭代公式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的题目,可参考如上代码

double sqrt(double x) {if (x == 0) return 0;double last = 0.0;double res = 1.0;while (!euqal(res,last)){last = res;res = (res + x / res) / 2;}return res;
}bool euqal(double num1, double num2)
{if ((num1 - num2) < 0.0000001 && (num1 - num2) > -0.0000001)return true;elsereturn false;
}

参考:

http://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html

转载于:https://www.cnblogs.com/chengxuyuanxiaowang/p/4349933.html

HappyLeetcode64:Sqrt(x)相关推荐

  1. Error in Math.factor() : ‘sqrt’ not meaningful for factors

    Error in Math.factor() : 'sqrt' not meaningful for factors 目录 Error in Math.factor() : 'sqrt' not me ...

  2. R语言sqrt函数为数值开平方根实战

    R语言sqrt函数为数值开平方根实战 目录 R语言sqrt函数为数值开平方根实战 #基本语法 #sqrt函数开平方根

  3. R语言数学函数:abs绝对值、sqrt平方根、ceiling向上近似整数、floor向下近似整数、trunc去除小数部分、round近似到指定小数位、signif近似到有效数字、三角函数、指数、对数

    R语言数学函数:abs绝对值.sqrt平方根.ceiling向上近似整数.floor向下近似整数.trunc去除小数部分.round近似到指定小数位.signif近似到有效数字.三角函数.指数.对数 ...

  4. 湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)...

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30746#problem/D D - 平方根大搜索 UVA12505 - Searchin ...

  5. c语言sprt的程序怎么用,sqrt函数在c语言中怎么用?

    c语言中,sqrt函数用于计算一个非负实数的平方根.使用方法:1.在程序中添加头文件"<math.h>":2.定义浮点类型变量x:3.使用sqrt(x)来求参数x的平方 ...

  6. LeetCode Sqrt(x)

    用牛顿求根法 首先,选择一个接近函数零点的,计算相应的和切线斜率(这里表示函数的导数).然后我们计算穿过点并且斜率为的直线和轴的交点的坐标,也就是求如下方程的解: 我们将新求得的点的坐标命名为,通常会 ...

  7. [Ynoi2019模拟赛]Yuno loves sqrt technology II

    题目大意: 给定一个数列,每次询问区间逆序对数,不强制在线. 题解: 如果不强制在线的话,我们可以离线下来搞一个莫队,每次指针左右移动的时候相当于查当前区间中有多少数比它大或者有多少数比它小,这个需要 ...

  8. SPOJ 2713 线段树(sqrt)

    题意:       给你n个数(n <= 100000),然后两种操作,0 x y :把x-y的数全都sqrt ,1 x y:输出 x-y的和. 思路:       直接线段树更新就行了,对于当 ...

  9. Sqrt(int x) leetcode java

    Reference: http://blog.csdn.net/lbyxiafei/article/details/9375735  题目: Implement int sqrt(int x). Co ...

最新文章

  1. [转]自适应网页设计(Responsive Web Design)
  2. 语言 双线性内插_合资插混间的实力较量,微蓝6 PHEV和卡罗拉双擎E+谁更值得选...
  3. Asya And Kittens
  4. vs2005 创建解决方案不显示,解决方案管理器中看不到解决方案节点的解决办法...
  5. DLL导出函数名称改编的解决方法
  6. HDFS学习 Java连接hadoop
  7. RS232通信之C++实现---PC端
  8. 使用java9的uuid生成方式,让uuid生成速度提升一个档次
  9. 使用共享内存作为进程互斥锁的代码
  10. Perfectly Clear Complete V3 mac(ps/lr智能修图插件)破解版
  11. Agilent函数发生器编程(Agilent IO Suite使用)
  12. 普通马甲包app上架App Store5.2.1或3.21被拒原因解析
  13. python 音乐相册_‎App Store 上的“魔力相册-音乐相册、视频电子相册制作工具”...
  14. 安装NET.FRAMEWORK报错:error 25015安装法度集 C:\Windows\Microsoft .NET\Framework\v2.0.50727\xxx.dl...
  15. 程序员年龄增大后的职业出路是什么?
  16. 第六章 Cesium学习入门之添加Geojson数据(dataSource)
  17. Window 10 激活 命令行操作
  18. 【perl】正则匹配中的括号套括号的套娃抓取规则
  19. 海航控股公布重整计划 海航“航”向何方?
  20. 计算机基础excel重点,计算机基础重点 (Excel ppt 网络基础)

热门文章

  1. C语言字符串倒排,C语言兑现简单的倒排文件索引
  2. Oracle 数据怎么实时同步到 PgSQL | 亲测干货分享建议收藏
  3. c语言中参数的传递方式是,C语言函数的参数及传递方式
  4. 用计算机探索规律反思,用计算器探索规律教学反思
  5. android动画超出圆角,Android关于Glide的使用(高斯模糊、加载监听、圆角图片)
  6. mac mysql 安装 简书_在Mac系统上配置MySQL以及Squel Pro
  7. IDEA Servlet页面报错
  8. 网际风全推数据接口_智能风控系统设计与实践
  9. 安庆机器人编程选_安庆市首届中小学机器人创客竞赛举行 460名选手比智慧拼创新 科技感满满!...
  10. CRITIC法之matlab