leetcode50:Pow(x,n)(c++)

本題有兩個地方需要考慮。

1.正負號
題目的n取值範圍爲231-2^{31}2312^{31}
如果n取231-2^{31},直接取該值負號,會出現內存溢出現象。
所以我們可以定義一個long類型再取負號,或使用abs函數。

2.暴力法超時問題
很多小夥伴會先想到逐個逐個乘,但這樣在數值大的時候會超時。、
針對這個問題,我們可能儘可能增大基底x,減小冪次n。
比如2的10次方,可以寫成4的5次方,還可以寫成416^2,最後寫成4256。

n爲偶數:xn=(x2)n/2x^n = (x^2)^{n/2}
n爲奇數:xn=x(x2)n/2x^n = x*(x^2)^{n/2}
可以看到奇數時,就是比偶數的式子多乘了一個x,於是編程的時候就可以先判斷是否是奇數,是奇數先乘下來。

依靠上面兩式,迭代至n爲0即可,也即最大化基底。

另外就是還有一些特殊情況,比如n=-0,x=+1等。

class Solution {
public:
    double myPow(double x, int n) {
        long k = abs(n);
        double res = 1;
        if(n == 0 || x == 1)
            return 1;
        cout << "test " <<  k << endl;
        while(k!=0)
        {
            if(k%2 == 1)
            {
                res*= x;
            }   
            x *=x;
            k/=2;
        }
        return n>0?res : 1/res;
    }
}; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章