【leetcode】69. x 的平方根( Sqrt(x) )


题目描述

【leetcode】69. x 的平方根( Sqrt(x) )
实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

在这里插入图片描述

第一次解答

思路:
暴力法
遍历[0,x]区间元素的平方,找到满足要求的数

注意:
溢出问题,由于x为int,最大范围为2^31-1,
则i*i最大可能是2(31+31)=262所以需要把i定位为long类型

test case:
2147395599
0
1
7

class Solution {
public:
    int mySqrt(int x) {
        for(unsigned long i=0; i<=x; ++i){
            if(i*i<=x && (i+1)*(i+1)>x){
                return i;
            }
        }
        return 0;
    }
};

结果:
在这里插入图片描述

第二次解答

一开始想用二分法,但是遇到了问题,虽然说最后结果误差已经很小了,但是题目要求整数位相同,这个达不到。例如传统方法对于9的平方根,可以迭代到2.999或3.0001,但是正确结果应该为3,而2.999舍去小数是2,就错了。
思路:
二分法。
x= 1*x, 所以x的平方根必定在[1,x]或[x,1]之间。
考虑到x为0情况,上述区间可以合并为:x的平方根必定在[0,x]之间

注意:
因为返回是整形,有没有必要用浮点?
如果只用整形,应该怎么保证精度至少到整形?
注意x=0,x=1的特例
二分法计算mid时,若用整形mid,会不会让mid陷入某个值动不了,导致整体死循环

test case:
2147395599
0
1
7


# <span id="ref">相关/参考链接</span> 

发布了88 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/a435262767/article/details/103829728