一、題目名稱java
Sqrt(x)(整數開方)函數
二、題目地址code
https://leetcode.com/problems/sqrtxip
三、題目內容leetcode
英文:Implement int sqrt(int x). Compute and return the square root of x.開發
中文:實現函數,實現整數x的開平方運算get
四、解題方法1數學
作這個題目,最簡單的方法莫過於使用語言自帶數學函數庫中的sqrt函數式,例以下面的Java代碼:io
/** * 功能說明:LeetCode 69 - Sqrt(x) * 開發人員:Tsybius2014 * 開發時間:2015年8月12日 */ public class Solution { /** * 開平方根 * @param x 被開方數 * @return 算術平方根 */ public int mySqrt(int x) { return (int)Math.sqrt((double)x); } }
五、解題方法2class
上面的方法較爲簡短,但也存在一個缺點:由於是整數開方,向下取整,所以不須要浮點數那麼高的精度,就能夠計算出正確的整型結果返回了。所以能夠嘗試使用牛頓法進行開方,而且while語句內並不像通常計算浮點數開方那樣保證偏差精確到1E-9如下,而是設置爲任意比1小的數字就能夠了。
牛頓法開平方公式以下:
具體內容可參看維基百科頁面:【平方根】條目下的【牛頓法】章節
https://zh.wikipedia.org/wiki/%E5%B9%B3%E6%96%B9%E6%A0%B9#.E7.89.9B.E9.A0.93.E6.B3.95
對於這個題目而言,下面這段Java代碼執行時間更短:
/** * 功能說明:LeetCode 69 - Sqrt(x) * 開發人員:Tsybius2014 * 開發時間:2015年8月12日 */ public class Solution { /** * 開平方根 * @param x 被開方數 * @return 算術平方根 */ public int mySqrt(int x) { if (x <= 0) { return 0; } double result = 1.0; while (Math.abs(result * result - x) > 0.9) { result = (result + x / result) / 2.0; } return (int)result; } }
END