要求:Implement int sqrt(int x).  Compute and return the square root of x.

解决方法:

1.牛顿法(Newton's method)

化解:计算  x2 = a 的解,令 y = x2 - a,相当于求解 y = 0 的解,f(x) 如图。

第一步:取 x0 = a / 2 , 如果  x0 不是解,在点( x0,y0) 做切线 y - y0 = (x - x0) * y'0 ,与 x 轴的交点为 x1 = x0 - y0 / y'0 = x0 - (x02 - a) / (2x0) = (x0 + a / x0) / 2 。

第二步:如果 x1 不是解,做一个经过  ( x1,y1) 这个点的切线,与x轴的交点为 x2。

…………

结束条件:

a.  f( xi ) ≈ 0;

b. xi ≈ xi-1.

代码:

inline double ABS(double x){
return x > 0 ? x : (-1 * x);
} class Solution {
public:
int sqrt(int x) {
/* 用牛顿迭代法求浮点数的平方根 */
double g0 = 0, g1 = x;
while(ABS(g1-g0) > 0.9)
{
g0 = g1;
g1 = (g0 + (x / g0)) / 2;
}
return floor(g1); // (int)g1
}
};

 2. 分治法(Divide and conquer)

a = 0 时,返回 0.

a = 1 时,返回 1.

a > 1 时,返回的数在序列 1 与 a/2 之间,序列有序,所以可以用二分法查找。

代码如下:

class Solution {
public:
int sqrt(int x){
/*********** 二分法 ************/
/*********************************/
if(x == 0) return 0;
if(x == 1) return 1;
unsigned long long begin = 1, end = x >> 1;
while(begin < end)
{
unsigned long long mid = (begin + end) >> 1;
unsigned long long tem = mid * mid;
if(tem == x) return mid;
else if(tem > x) end = mid -1;
else begin = mid + 1;
}
if(begin = end)
{
unsigned long long tem = end * end;
if(tem <= x) return end;
if(tem > x) return end - 1;
}
else return end;
}
};

3. 构造数字

从高位到低位,依次试探添加 1。

class Solution {
public:
int sqrt(int x) {
int ans = 0;
int bit = 0X40000000;
while(bit > 0) {
ans |= bit;
if (ans > x / ans) {
ans ^= bit;
}
bit >>= 1;
}
return ans; }
};

3.Sqrt(x)的更多相关文章

  1. 速算1/Sqrt(x)背后的数学原理

    概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...

  2. [LeetCode] Sqrt(x) 求平方根

    Implement int sqrt(int x). Compute and return the square root of x. 这道题要求我们求平方根,我们能想到的方法就是算一个候选值的平方, ...

  3. Leetcode 69. Sqrt(x)

    Implement int sqrt(int x). 思路: Binary Search class Solution(object): def mySqrt(self, x): "&quo ...

  4. 欧几里得证明$\sqrt{2}$是无理数

    选自<费马大定理:一个困惑了世间智者358年的谜>,有少许改动. 原译者:薛密 \(\sqrt{2}\)是无理数,即不能写成一个分数.欧几里得以反证法证明此结论.第一步是假定相反的事实是真 ...

  5. 求sqrt()底层效率问题(二分/牛顿迭代)

    偶然看见一段求根的神代码,于是就有了这篇博客: 对于求根问题,通常我们可以调用sqrt库函数,不过知其然需知其所以然,我们看一下求根的方法: 比较简单方法就是二分咯: 代码: #include< ...

  6. 【leetcode】Sqrt(x)

    题目描述: Implement int sqrt(int x). Compute and return the square root of x. 实现开根号,并且返回整数值(这个很重要,不是整数的话 ...

  7. Leetcode Sqrt(x)

    参考Babylonian method  (x0  越接近S的平方根越好) class Solution { public: int sqrt(double x) { ) ; , tolerance ...

  8. Sqrt(x) - LintCode

    examination questions Implement int sqrt(int x). Compute and return the square root of x. Example sq ...

  9. UVa 12505 Searching in sqrt(n)

    传送门 一开始在vjudge上看到这题时,标的来源是CSU 1120,第八届湖南省赛D题“平方根大搜索”.今天交题时CSU突然跪了,后来查了一下看哪家OJ还挂了这道题,竟然发现这题是出自UVA的,而且 ...

随机推荐

  1. 1427. SMS

    http://acm.timus.ru/problem.aspx?space=1&num=1427 没想到这道题错了N遍  细节很重要呀 代码: #include<iostream> ...

  2. movebase导航

    利用turtlebot 的导航配置文件 由于movbase发的速度太不友好了所以使用了ros自带的滤波安装相应的包 apt-get install ros-indigo-yocs-velocity-s ...

  3. debug实战:COM组件GetToSTA导致高内存+GC被阻塞

    最近花了好几周解决一个WPF高内存的问题,问题的表象是内存不断增加.未被回收,根源是GC的FinalizeThread被阻塞,导致整个GC挂掉.从以下几步来分析这个问题: 1.用ANTS Memory ...

  4. c/c++面试题(4)字符串翻转/打印任意进制格式/类型转换

    1.字符串的翻转,这里一般是字符数组.不包括字符串字面值. char* reversal_str(char* str,size_t size); 翻转之后的字符串是原来的字符串的翻转. #includ ...

  5. HDU 4734 F(x)

    这题可能非递归版好写? #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  6. MVC 多级目录菜单

    MVC多级目录菜单  ----- 简单模拟 Model ---- cs { public class Class1 { public int ID{get;set;} public int paren ...

  7. gulp ---攻略一

    根据项目需要可能会出连载 项目需要现在用gulp进行js的质量检测.合并.压缩.发布,未来需要进行sass的编译.合并.压缩,html.img的压缩以及md5戳.reload等功能,暂时先测试js的质 ...

  8. NOSCRIPT标签的用处

    NOSCRIPT标签用来定义在脚本未被执行时的替代内容.也可以用在检测浏览器是否支持脚本,若不支持脚本则可以显示NOSCRIPT标签里的innerText. eg:<body> ... . ...

  9. 带优先级的队列 - PHP实现

    很久以前写的一个功能,当时需要一个优先级的队列,特用新学的swoole写了一个简单的demo,仅满足当时的需求. 功能说明: 完全参考httpsqs增加优先级参数level 例:           ...

  10. Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

     Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四) 在Android Priority Job Queue (Jo ...