题目描述
【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>