前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-69-Sqrt(x)

leetcode-69-Sqrt(x)

作者头像
chenjx85
发布2018-05-21 18:34:09
7970
发布2018-05-21 18:34:09
举报

题目描述:

Implement int sqrt(int x).

Compute and return the square root of x.

x is guaranteed to be a non-negative integer.

Example 1:

代码语言:javascript
复制
Input: 4
Output: 2

Example 2:

代码语言:javascript
复制
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated

要实现的函数:

int mySqrt(int x)

代码:

代码语言:javascript
复制
#include<climits>
int mySqrt(int x) 
{
    if(x>=2147395600&&x<=INT_MAX)//**
    return 46340;//**
    for(int i=0;i<=x;i++)
    {    
        if((i*i<=x)&&((i+1)*(i+1)>x))
        return i;
    }
}

说明:

1、本题目采用上述代码很容易实现,但是有一个问题就是时间花费巨大,采用二分查找会好很多……

2、本题目若是要求输出sqrt(x)的完整结果,而不仅仅是整数部分,那么应该采取牛顿迭代法或者泰勒公式展开的方法。最开始就考虑了泰勒展开的方法,后来重新看了下题目,发现打扰了走错路了……

3、c++对于立即数的存储和处理采用的是int类型。

cout<<46341*46341<<endl;的时候,会提示“interger overflow”,因为INT_MAX比46341*46341小。

同理,如果if(46341*46341>INT_MAX)cout<<“good“<<endl;代码运行不会输出good的,因为这时候已经溢出了,结果不会大于INT_MAX的。

之所以要提这一点,是因为最开始的代码中,没有//**标记的那两行。

各位同学想想若是直接去掉了这两行,当x=INT_MAX的时候,mySqrt(x)执行结果会是什么?

后续:

参考CSDN博主小村长的二分查找代码,如下,beats 23.97% of cpp submissions

代码语言:javascript
复制
int mySqrt(int x) 
{       
    if(x>=2147395600&&x<=INT_MAX)//**
    return 46340; //**
    double begin = 0;  
    double end = x;  
    double result = 1;  
    double mid = 1;  
    while(abs(result-x) > 0.000001)
    {
        mid = (begin+end)/2;  
        result = mid*mid;  
        if(result > x)   // 二分的范围  
        end = mid;  
        else
        begin = mid;  
    }  
    return (int)mid;  
}   

上述代码//**那两行同样道理。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要实现的函数:
  • 代码:
  • 说明:
  • 后续:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档