Skip to content

Commit 176f37f

Browse files
author
luzhipeng
committed
feat: 每日一题2019-06-27
1 parent 4414c1b commit 176f37f

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

Diff for: assets/daily/.gitkeep

Whitespace-only changes.

Diff for: assets/daily/2019-06-27.gif

48.9 KB
Loading

Diff for: daily/2019-06-27.md

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
## 每日一题 - mySqrt
2+
3+
### 信息卡片
4+
5+
- 时间:2019-06-21
6+
- 题目链接:- (但是 leetcode 上有一个相似的题目https://leetcode.com/problems/sqrt-x/)
7+
- tag:`binary search` `math`
8+
9+
### 题目描述
10+
11+
```
12+
要求不用数学库,求 sqrt(2)精确到小数点后 10 位
13+
```
14+
15+
### 参考答案
16+
17+
1. 二分法
18+
19+
这个解法比较直接,就是普通的二分。
20+
通过每次取中间值进行比较,我们可以舍去一半的结果。时间复杂度logn
21+
22+
参考代码:
23+
24+
```js
25+
function sqrt(num) {
26+
if (num < 0) return num;
27+
let start = 0;
28+
let end = num;
29+
let mid = num >> 1;
30+
const DIGIT_COUNT = 10;
31+
const PRECISION = Math.pow(0.1, DIGIT_COUNT);
32+
while (Math.abs(+(num - mid * mid).toFixed(DIGIT_COUNT)) > PRECISION) {
33+
mid = start + (end - start) / 2.0;
34+
if (mid * mid < num) {
35+
start = mid;
36+
} else {
37+
end = mid;
38+
}
39+
}
40+
41+
return mid;
42+
}
43+
```
44+
45+
2. 牛顿迭代法
46+
47+
这种方法是牛顿发明的,比较巧妙。
48+
其实上述问题可以转化为x^2-a = 0,求x的值。其实也就是曲线和y轴交点的横坐标。
49+
我们可以不断用f(x)的切线来逼近方程 x^2-a = 0的根。
50+
根号a实际上就是x^2-a=0的一个正实根,由于这个函数的导数是2x。
51+
也就是说,函数上任一点(x,f(x))处的切线斜率是2x。
52+
那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入 f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。
53+
54+
![2019-06-27](../assets/daily/2019-06-27.gif)
55+
56+
(图片来自Wikipedia)
57+
58+
参考代码:
59+
60+
```js
61+
function sqrtNewton(n) {
62+
if (n <= 0) return n;
63+
64+
let res;
65+
let last;
66+
const DIGIT_COUNT = 10;
67+
const PRECISION = Math.pow(0.1, DIGIT_COUNT);
68+
69+
res = n;
70+
71+
while (Math.abs(last - res) > PRECISION) {
72+
last = res;
73+
res = (res + n / res) / 2;
74+
}
75+
76+
return res;
77+
}
78+
```
79+
80+
### 其他优秀解答
81+
82+
```
83+
暂无
84+
```

Diff for: daily/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,9 @@ tag: `sql`
7777

7878
时间: 2019-06-21
7979

80+
### [mySqrt](./2019-06-27.md)
81+
82+
tag: `inary search` `math`
83+
84+
时间: 2019-06-27
85+

0 commit comments

Comments
 (0)