1. 程式人生 > >Pow()函式、sqrt()函式的實現

Pow()函式、sqrt()函式的實現

對於一些球指數冪、開方等函式經常會出現在筆試面試中。

50Pow(x, n)

題目描述

Implement pow(xn).

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);
    }
};

69Sqrt(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;  
    }
};