经过昨天那道题,我觉得今天这道题简单多了
这个简单题才是真的简单题
目录
题目
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
(一些废话:第一眼看到题目不允许用函数求算术平方根其实是有点苦恼的
我之前写编程题遇到开平方都是用函数写的,但用函数写这个题就没意义了)
首先想到的是整数遍历,比较哪个整数的平方更接近输入的x
但是这会出现两个问题,
一是碰到大的数会超时,
二是题目的要求是舍去小数部分,但是像2.82这种数必然会更接近3,也就是说程序会输出3
然后突然想到了二分法,二分法会更快,而且可以通过选择输出i或j来使输出那个数是小的
代码
int mySqrt(int x){
int i,j;
int m;
i=0;j=x;
while(i<=j){
m=(i+j)/2;
if(m*m==x){
return m;
}else if(m*m>x){
j=m-1;
}else{
i=m+1;
}
}
return j;
}
这个报了溢出,所以要把i,j,m定义成long(虽然我不明白它输入的是一个int为什么会溢出)
int mySqrt(int x){
long i,j;
long m;
i=0;j=x;
while(i<=j){
m=(i+j)/2;
if(m*m==x){
return m;
}else if(m*m>x){
j=m-1;
}else{
i=m+1;
}
}
return j;
}
改完以后就提交通过了