Pow()函式、sqrt()函式的實現
阿新 • • 發佈:2019-02-14
對於一些球指數冪、開方等函式經常會出現在筆試面試中。
50. Pow(x, n)
題目描述:
Implement pow(x, n).Example 1:
Input: 2.00000, 10 Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
題目解析:
1. 本題是想求:一個double數的整數次冪的庫函式。
2. 最簡單的方法是設定一個for迴圈,依次乘以給定的double,知道次數滿足給定冪整數,如果是負數結果求導數就行。但是比較慢。
3. 比較好的做法是:每次都在當前結果上面求平方。這個時間複雜度就低了,看程式碼:
程式碼如下:
class Solution { public: double myPow(double x, int n) { if(n == 0) return 1; double half = myPow(x, n/2); // 如果n是偶數 if(n%2 == 0) return half*half; // n是大於0的奇數 else if(n > 0) return half*half*x; // n是小於0的奇數 else return half*half*(1/x); } };
69. Sqrt(x)
題目描述:
Implement int sqrt(int x)
.
Compute and return the square root of x.
x is guaranteed to be a non-negative integer.
Example 1:
Input: 4 Output: 2
Example 2:
Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since we want to return an integer, the decimal part will be truncated.
題目解析:
1. 此題的意思是求一個整數的開方整數部分。暴力解法是:從1開始到這個整數之間開始試,找到第一個平方大於當前整數之前的那個數字就是了。當然,too slowly。當然要想到二分查詢來解決。 2. 利用二分查詢,每次淘汰一半的數,效率會很高。但是,在LeetCode上面做題時,必須考慮到整數平方會溢位的情況,測試後定位為unsigned longlong 型就不會溢位了。看程式碼。程式碼如下:
class Solution { public: // 使用二分法求解,為了防止溢位。定義變數為unsigned long long型別 int mySqrt(int x) { if(x == 0 || x== 1) return x; unsigned long long start = 0; unsigned long long end = x; while(start < end) { unsigned long long mid = start + (end-start)/2; unsigned long long res = mid*mid; if(res == x) return mid; else if(res > x) end = mid; else start = mid; if(end -start == 1) break; } return start; } };