leetcode 69 Sqrt(x)
实现开平方。
解决:
n分逼近
int mySqrt(int x) { int start = 0; int end = x; int64_t i; while (start < end) { i = start + ((end - start) >> 6) + 1; if (i * i == x) return i; else if (i * i > x) end = i - 1; else start = i; } return end; }
牛顿迭代法:
int mySqrt(int x) { if (x <= 1) return x; int64_t r = x >> 1; while (r * r > x) r = (r + x / r) >> 1; return r; }
牛顿迭代是求近似根的一种方法。
刚看到就想证明:
即若有:
r * r > x (一)
[(r + x/r) / 2] ^ 2 < x
则:
[(r + x/r) / 2 + 1] ^ 2 > x
利用式(一)若干次放大缩小即可。
思考:
抛开数学不谈。
注意几个点:用64位整数做乘法比做除法快(除法也可ac);用移位做除法(解法一除多少都行,数字越大除越大越快接近)。
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】