劍指offer-數值的整數次方
阿新 • • 發佈:2018-05-16
class question cpp i++ tro 告訴 優化 pan highlight
題目描述
給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
解題思路
對於這道題,要考慮四種情況:
1、底數為0,指數為負數的情況,無意義
2、指數為0,返回1
3、指數為負數,返回1.0/base,-exponent
4、指數正數,base,exponent
第一反應我們會寫出來的代碼:
class Solution { public: double Power(double base, int exponent) { double re=1.0; for(int i=1;i<=exponent;i++){ re*=base; } return re; } };
但如果輸入的指數(exponent)小於1,即是0和負數的時候怎麽辦?上面的代碼完全沒有考慮,只包括了指數為正數的情況。
進階版代碼:
我們知道當指數為負數的時候,可以先對指數求絕對值,然後算出次方的結果之後再取倒數。既然有求倒數,我們很自然的就要想到有沒有可能對0求倒數,如果對0求倒數怎麽辦?當底數base是零且指數是負數的時候,我們不做特殊的處理,就會發現對0求倒數從而導致程序運行出錯。怎麽告訴函數的調用者出現了這種錯誤?在Java中可以拋出異常來解決。
最後需要指出的是,由於0的0次方在數學上沒有意義的,因此無論是輸出0還是1都是可以接收的,但這都需要和面試官說清楚,表明我們已經考慮到了這個邊界值了。
有了這些相對而言已經全面很多的考慮,我們就可以把最初的代碼修改如下:
class Solution { public: double Power(double base, int exponent) { double re=1.0; if(exponent==0) return 1.0; if(base==0) return 0; if(exponent<0){ base=1.0/base; } while(exponent){ exponent=(exponent<0)?(++exponent):(--exponent); re*=base; } return re; } };
上面代碼運行時間是3ms,內存472k
優化求冪函數
當n為偶數,a^n =(a^n/2)*(a^n/2)
當n為奇數,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
時間復雜度O(logn)
參考資料:
https://blog.csdn.net/jsqfengbao/article/details/47164537
https://www.nowcoder.com/questionTerminal/1a834e5e3e1a4b7ba251417554e07c00劍指offer-數值的整數次方