Skip to content

Commit bac304e

Browse files
committed
sqrt 的分解法,left and right =>mid
1 parent 3420ffa commit bac304e

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

Divid-and-Conquer/sqrt(x)_pow(x)

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
两个题目都是一半半的来解答,sqrt 的那个分解更加隐藏,是需要相应的数学知识来证明的
2+
class Solution {
3+
public:
4+
int sqrt(int x) {
5+
int left = 1,right = x / 2;// 最大到此数的一半
6+
int last_mid = 0; // 来记录不能整开方的数,上一次数值就是答案
7+
if(x < 2)
8+
return x;
9+
while(left <= right)
10+
{
11+
int mid = left + (right - left)/2;
12+
if(x / mid > mid) // 为什么不能用 x > mid * mid ? oo 明白了,相乘可能会溢出,用除比较安全
13+
{
14+
left =mid+ 1;
15+
last_mid = mid;
16+
}
17+
else
18+
if(x / mid < mid)
19+
{
20+
right = mid -1;// 小了就已经得到值了
21+
}
22+
else
23+
return mid;
24+
}
25+
return last_mid;
26+
}
27+
};
28+
29+
Pow
30+
class Solution {
31+
public:
32+
double step(double x,int n)
33+
{
34+
if(n == 0)
35+
return 1;
36+
double v = step(x,n / 2);
37+
if(n % 2 == 0)
38+
return v * v;
39+
else
40+
return v * v * x;
41+
}
42+
double pow(double x, int n) {
43+
if (n < 0)
44+
return 1.0 / step(x,-n);
45+
return step(x,n);
46+
}
47+
};

0 commit comments

Comments
 (0)