x的平方根
说明
给你一个非负整数 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) 链接:leetcode.cn/problems/sq…
题解
解法一
思路:根据计算出的规则:
- 1.2长度的数字的算术平方根在 0-9这个范围 10 ^ 1
- 3、4长度的数字的算术平方根在 10 - 99这个范围 10 ^ 2
- .....
- 9,10长度的数字的算术平方根在 10000 - 99999这个范围 10 ^ 5
- ......
public static void main(String[] args) {
int x = 94354;
System.out.println(demo(x));
}
public static int demo(int x){
if(x == 1)
return 1;
int length = (x+"").length();
if(length % 2 == 1){
length = length / 2 + 1;
}else{
length /= 2;
}
long min = 0;
if(length == 1){
for (int i = 0; i < 11; i++) {
if(i * i > x){
return i - 1;
}
}
}else{
min = 1;
for (int i = 0; i < length-1; i++) {
min *= 10;
}
long max = min * 10 - 1;
for (long i = min; i < max; i++) {
//这里: x = i * ? ---> ? = x / i
//当?等于 i的时候,就表示 i 是x的算术平方根
//当 ? 小于 i的时候,i * ? > x,因为是取小,所以 i - 1 = ?
long number = x / i;
if(number < i){
return (int) i-1;
}else if(number == i){
return (int) i;
}
}
}
return (int) min;
}
解法二
二分查找,力扣大佬写的
if(x == 1)
return 1;
int min = 0;
int max = x;
while(max-min>1)
{
int m = (max+min)/2;
if(x/m<m)
max = m;
else
min = m;
}
return min;