1. 程式人生 > >劍指offer-數值的整數次方

劍指offer-數值的整數次方

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-數值的整數次方