Leetcode 面試題16. 數值的整數次方【快速冪運算】

問題描述

實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。

解題報告

求解xnx^n時:
如果n是奇數,則 xn=x(n/2)2xx^n=x^{(n/2)\cdot2}\cdot x
如果n是偶數,則 xn=x(n/2)2x^n=x^{(n/2)\cdot2}
一直這樣迭代下去。

這樣做的原因是減少乘法的計算次數。
因爲 n 可正可負,所以當n爲負數時,將其取反,但是因爲32位有符號整數的取值範圍是[231,2311-2^{31},2^{31}-1]

所以當n取值 -2147483648 [32位有符號整數的最小數]時,需要單獨進行處理。

實現代碼

class Solution {
public:
    double myPow(double x, int n) {
        double ans;
        bool flag=true;
        if(n==0) return 1.0;
        if(n==-2147483648){
            ans=myPow(x, 1073741824);
            return 1.0/(ans*ans);
        }
        if(n<0){
            flag=false;
            n=-n;
        }
        if(n%2==0){
            ans=myPow(x,n/2);
            return flag?ans*ans:1.0/(ans*ans);
        }
        else{
            ans= myPow(x,n/2);
            return flag?ans*ans*x:1.0/(ans*ans*x);
        }
    }
};

參考資料

[1] Leetcode 面試題16. 數值的整數次方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章