题解
- 袖珍计算器
x^1/2 = (e^lnx)^1/2 = e^(1/2lnx)
转换成求lnx
,感觉没有什么提升,都用了内置函数,还不如直接调用sqrt
- 二分查找
public int mySqrt(int x) {
long i = 1, j = x, ans = 0;
while(i<=j){
long mid = (i+j)/2;
if(mid*mid <= x) {
ans = mid;
i = mid+1;
}
if(mid*mid > x) j = mid-1;
}
return (int)ans;
}
- 牛顿迭代:数值计算方法,(通过泰勒展开可以证明具有二次收敛的特性)
- 构造函数
f(x)=x^2 - C
,C>0
,求f(x)
的零点- 牛顿迭代法是通过
f(x)
在零点处泰勒展开,然后舍弃o(x^2)
之后得到,化简后就是x[i+1]=x[i]-f(x[i])/f'(x[i])
- 当
f(x)=x^2
的时候,x[i+1]=1/2*(x[i]+C/x[i])
,当x[i+1]-x[i]
的差距小的一定程度(1e-7
)的时候,就可以停止迭代了,这个方法比二分还快
public int mySqrt(int x) { if (x == 0) { return 0; } double C = x, x0 = x; while (true) { double xi = 0.5 * (x0 + C / x0); if (Math.abs(x0 - xi) < 1e-7) { break; } x0 = xi; } return (int)x0; }
- 牛顿迭代法是通过