博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.Sqrt(x)
阅读量:5098 次
发布时间:2019-06-13

本文共 1848 字,大约阅读时间需要 6 分钟。

要求: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;    }};

 

 

 

转载于:https://www.cnblogs.com/liyangguang1988/p/3617926.html

你可能感兴趣的文章
Jade之Template Inheritance
查看>>
Magento2.X 后端开发简要1
查看>>
大话文本检测经典模型:EAST
查看>>
文本主题模型之LDA(一) LDA基础
查看>>
linux基础命令-chgrp/chown/chomd
查看>>
待整理
查看>>
iOS 6
查看>>
Nginx入门篇-基础知识与linux下安装操作
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
1.linux ping:unknown host www.***.***
查看>>
Swagger自动生成接口文档
查看>>
MyEclipse2016项目内复制一个项目,如何更改项目的访问路径
查看>>
扩展类方法
查看>>
当客户说“贵”时,你该怎么办?
查看>>
DLV:低价值展示(就是丢脸的)
查看>>
BZOJ 3924: [Zjoi2015]幻想乡战略游戏
查看>>
封装Js库从获取控件的value值开始
查看>>
Python实现设计模式——工厂模式
查看>>
Linux_old_boy_02
查看>>