50 Pow(x, n)

Implement pow(x, n).

解題思路

首先給大家介紹一下快速冪算法

以mn為例,可以先將n轉(zhuǎn)換為二進(jìn)制數(shù),例如

m11 = m(20+21+23)

再將式子進(jìn)行一下變形,就可以得到

m11 = m20m21m23

然后我們就可以通過迭代來計算m2i,這樣就可以把算法的復(fù)雜度降到O(nlogn)

舉個栗子

以211為例,我們用變量ans存儲結(jié)果,用tmp存儲22i的值

已知:

211 = 220221223

Step 1:

初始值 ans = 1, tmp = 220 = 2

Step 2:

因為211里包含了220這項,所以ans = ans*tmp = 2, tmp = 221 = tmp * tmp = 4;

Step 3:

因為211里包含了221這項,所以ans = ans*tmp = 8, tmp = 222 = tmp * tmp = 16;

Step 4:

因為211里不包含222這項,所以ans保持不變, tmp = 223 = tmp * tmp = 256;

Step 5:

因為211里包含了223這項,所以ans = ans*tmp = 2048, tmp = 224 = tmp * tmp = 65536;

以上,我們就算出了211的值。mn也是同理~


代碼

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1.0;
        double tmp = x;
        long long num = (long long)n;
        
        if (n<0){
            num = -num; tmp = 1/x;
        }
      
        while (num > 0){
            if (num%2 == 1){
                res = res*tmp;
            }
            tmp = tmp*tmp;
            num = num/2;
        }
        
        return res;
    }
};

PS: 有人會問這里為什么要多此一舉轉(zhuǎn)換為long long,是因為我在數(shù)據(jù)里看到了-2147483648。所以,你懂的~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容